ajax rails form_with提交但仅在页面重新加载后

时间:2018-03-25 21:22:46

标签: ruby-on-rails ajax

我在资源show.html.erb上有一个现有的评论表单,我希望将其添加到展示页面,而无需重新加载整个页面。我理解通过' form_with'使用ajax形式,这应该是完全可能的。

我的问题是,虽然表单确实会创建一个新评论,但它只会在我刷新页面后显示。

我也收到以下错误。

  

ArgumentError(参数太少):

     

app / controllers / comments_controller.rb:18:格式'   app / controllers / comments_controller.rb:18:在'创建'

comments_controller

class CommentsController < ApplicationController
  before_action :load_commentable
  before_action :authenticate_user!
  before_action :comment_auth, only:  [:edit, :update, :destroy]

...

  def create
    @comment = @commentable.comments.new(allowed_params)
    @comment.user_id=current_user.id if current_user
    if @comment.save
      format.html { redirect_to @commentable, notice: "Comment added." }
      format.js
    else
      render 'edit'
    end

...

视图/评论/ create.js.coffee

comment = document.getElementById("comment")
comment.innerHTML = "<%= j render(@comment) %>"

视图/评论/ _form.html.erb

<%= form_with(model: [@commentable, @comment]) do |f| %>
  <% if @comment.errors.any? %>
    <div class="error_messages">
      <h2>Please correct the following errors.</h2>
      <ul>
      <% @comment.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <strong><%= f.label :name, :class=>'form-label' %></strong><br>
    <%= f.text_field :name, value: current_user.fname, readonly: true, :class=>'form-control' %>
  </p>

  <p>
    <strong><%= f.label :title, :class=>'form-label' %></strong><br>
    <%= f.text_field :title, :class=>'form-control' %>
  </p>

  <p>
    <strong><%= f.label :review, :class=>'form-label' %></strong><br>
    <%= f.text_area :body, :class=>'form-control', rows: 5 %>
  </p>
  <p>
    <%= f.submit :class=>'btn btn-success' %>
  </p>
<% end %>

2 个答案:

答案 0 :(得分:0)

如您所知,form_with它是一个远程表单,您不应该在那里使用redirect_to。请删除你的块

if @comment.save
  format.html { redirect_to @commentable, notice: "Comment added." }
  format.js
else
  render 'edit'
end

将其替换为

if @comment.save
  @status = "success"
end

您可以向views/comments/create.js.erb(它不是.js.coffee)添加通知消息,条件为@status(失败/成功)。

希望这有帮助。

答案 1 :(得分:0)

对我来说,我需要

<%= form_with(model: @message, method: :post, local: true) do |f| %> 

local:必须为true。所有其他连击都不在远程工作:真,远程:假,本地:假