Rails 500 服务器错误,对 form_for 部分的 Ajax 请求
Posted
技术标签:
【中文标题】Rails 500 服务器错误,对 form_for 部分的 Ajax 请求【英文标题】:Rails 500 Server Error, Ajax Request to form_for partial 【发布时间】:2020-10-20 03:25:42 【问题描述】:我正在创建一个博客,我正在尝试创建一个仪表板,用户可以在其中选择侧边菜单中的新建,并在仪表板页面上呈现创建新文章表单。我正在尝试使用 ajax 请求来呈现表单来完成此操作。但是,当我有 form_for Article.new 时,表单会呈现,但是当我提交时什么也没有发生。我意识到自己的错误并尝试了 form_for Article,但现在我收到了 500 服务器错误。我还尝试在我的仪表板控制器 create_new_article 操作中创建 @article = Article.new 并传递 form_for @article 但我仍然收到 500 错误。有人可以帮我调试为什么会这样吗?我不断收到弃用警告,指出“弃用] 主线程上的同步 XMLHttpRequest 已弃用,因为它对最终用户的体验产生不利影响。”我不确定这是否与它有关。谢谢!
dashboard.html.erb<div class="row fill-screen dashboard">
<div class="column-1">
<%= render 'side_menu' %>
</div>
<div class="column-10">
<div id="content"></div>
</div>
<div class="column-1">
</div>
</div>
-
dashboard_controller.rb
class DashboardController < ApplicationController
def home
end
private
def render_partial
respond_to do |format|
format.html
format.js
end
end
def show_all_articles
render_partial
end
def create_new_article
render_partial
end
end
-
_side_menu.html.erb
<div class="side-menu">
<div>
<h2>Articles</h2>
<%= link_to "Show", show_all_articles_path, remote: true %>
<%= link_to "New", create_new_article_path, remote: true %>
</div>
</div>
-
create_new_article.js.erb
$('#content').html("<%= escape_javascript(render :partial => 'create_new_article')%>");
-
_create_new_article.html.erb
<%= tinymce_assets %>
<form>
<%= form_for Article do |f| %>
<%= f.label :title, 'Title' %>
<%= f.text_field :title %>
<%= f.label :thumbnail, 'Thumbnail URL'%>
<%= f.text_field :thumbnail%>
<%= f.label :description, 'Description' %>
<%= f.text_field :description %>
<%= f.label :content, 'Content' %>
<%= f.text_area :content, :class => 'tinymce'%>
<%= f.submit %>
<% end %>
</form>
<%= tinymce %>
-
articles_controller.rb
class ArticlesController < ApplicationController
skip_before_action :admin, except: [:show]
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
if @article.save
flash[:notice] = "Article was successfully created"
redirect_to article_path(@article)
else
render dashboard_path
end
end
def index
@articles = Article.all
end
private
def article_params
params.require(:article).permit(:title, :description)
end
def show
@article = Article.find(params[:id])
end
def edit
@article = Article.find(params[:id])
end
def update
@article = Article.find(params[:id])
if @article.update(article_params)
flash[:notice] = "Article was updated"
redirect_to article_path(@article)
else
flash[:notice] = "Article was not updated"
render 'edit'
end
end
routes.rb
#Articles
resources :articles
#Dashboard
get 'dashboard', to: 'dashboard#home', as: 'dashboard'
get 'show_all_articles', to: 'dashboard#show_all_articles'
get 'create_new_article', to: 'dashboard#create_new_article'
rails 日志
ActionView::Template::Error (undefined method `to_key' for #<Class:0x00007f897f5ddaf8>
Did you mean? to_query):
1: <%= tinymce_assets %>
2: <form>
3: <%= form_for Article do |f| %>
4:
5: <%= f.label :title, 'Title' %>
6: <%= f.text_field :title %>
【问题讨论】:
使用 byebug 检查 Article 试图呈现什么? 通常在您尝试在集合上使用表单而不是实体时发生 【参考方案1】:我找到了一个修复方法,但我不完全确定我理解为什么它现在可以正常工作,因为我是 Rails 新手。
首先我尝试在实例变量中定义我的模型并在表单中使用该实例变量,但它返回 null#controller
def create_new_article
@article = Article.new
end
#view
<%= form_with model: @article do |f| %>
然后我尝试直接在表单中直接调用 Article 模型,但这是说 Article 的方法无效 to_key
#view
<%= form_with model: Article do |f| %>
最后我尝试直接在表单中调用 Article.new。这不会导致运行时错误,但是当我单击表单中的提交时,什么也没有发生。我意识到这是因为我的 routes.rb 中没有正确路由发布请求
#view
<%= form_with model: Article.new do |f| %>
#routes
post 'create_new_article', to: 'articles#create'
这最终允许我使用 ajax 请求在我的仪表板控制器上创建一个文章表单。仍然因为我是 Rails 新手,我不确定这是否是最好的解决方案。谢谢!
【讨论】:
以上是关于Rails 500 服务器错误,对 form_for 部分的 Ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章
尝试访问损坏的图片 url 时抛出内部服务器错误 500 而不是 404
Rails ajax 调用同时产生 404 和 500 错误
已完成 500 内部服务器错误; RestClient::NotAcceptable(406 不可接受)