1

我有以下内容:

路线.rb:

  resources :posts do
    resources :replies
  end

回复_controller.rb:

class RepliesController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @reply = @post.replies.build(params[:reply])
    @reply.user_id = current_user.id
    if @reply.save
      flash[:success] = "reply created!"
      redirect_to post_path(@post)
    else
      redirect_to post_path(@post)
    end
  end

回复/_form.html.erb:

<%= form_for([@post, @post.replies.build]) do |f| %>
  <%= render 'shared/error_messages', object: f.object, target: @reply %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Enter reply content" %>
  </div>
  <%= f.submit "Reply", class: "btn btn-large btn-primary" %>
<% end %>

帖子/show.html.erb:

 <div class="span8">
    <%= render 'replies/form' %>
  </div>

共享/error_messages.html.erb:

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-error">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li>* <%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

我不确定为什么replies我使用的错误消息没有显示target: @reply(:content 和 :user_id 是必需的)。

有什么建议可以解决这个问题吗?

4

1 回答 1

4

在创建方法的else部分中,您必须渲染 post_path(@post) 而不是重定向 post_path(@post)

在创建部分的其他部分尝试这个

render :template => 'posts/show'

这样您当前的@reply对象将持续存在您的错误消息。

redirect_to post_path(@post)将在 show 操作中重新定义@reply对象(我假设您已经在那里定义了 @reply 对象)。

帖子/显示操作中,在那里构建您的回复对象并将其分配给@reply 实例对象。

@reply = @post.replies.build

现在在回复/_form.html.erb 中

将 @post.replies.build 更改为 @reply

IE

<%= form_for([@post, @post.replies.build]) do |f| %>

<%= form_for([@post, @reply]) do |f| %>

在渲染“shared/error_messages”部分时,还将@reply分配给对象变量,

<%= form_for([@post, @reply]) do |f| %>
  <%= render :partial => 'shared/error_messages', :locals => {:object => @reply} %>
  <div class="field">
   <%= f.text_area :content, placeholder: "Enter reply content" %>
  </div>
 <%= f.submit "Reply", class: "btn btn-large btn-primary" %>
<% end %>

还要对共享文件夹 ( shared/_error_messages )中的 error_messages 进行部分处理。在这个部分粘贴你的代码是在shared/error_messages

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-error">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
   <ul>
   <% object.errors.full_messages.each do |msg| %>
     <li>* <%= msg %></li>
   <% end %>
  </ul>
</div>
于 2012-11-11T13:26:54.520 回答