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 请求的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4,Ajax 导致 404 和 500 错误

尝试访问损坏的图片 url 时抛出内部服务器错误 500 而不是 404

Rails ajax 调用同时产生 404 和 500 错误

已完成 500 内部服务器错误; RestClient::NotAcceptable(406 不可接受)

访问 $GITLAB/admin/runners 时出现内部服务器错误 500

在 Heroku 上部署后 API 端点返回 500 错误