我在资源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 %>
答案 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。所有其他连击都不在远程工作:真,远程:假,本地:假