即使我使用“目标”,嵌套资源的错误也不会显示?

时间:2012-11-11 10:24:12

标签: ruby-on-rails

我有以下内容:

routes.rb中:

  resources :posts do
    resources :replies
  end

replies_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是必需的)。

有任何解决此问题的建议吗?

1 个答案:

答案 0 :(得分:4)

在create method的 else 部分中,您必须渲染post_path(@post)而不是重定向post_path(@post)

在创建部分的 else 部分尝试此操作

render :template => 'posts/show'

这样您当前的 @reply 对象将会保留您的错误消息。

redirect_to post_path(@ post)将在show action中重新定义 @reply 对象(我假设您已在其中定义了@reply对象)。

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

@reply = @post.replies.build

现在在回复/ _form.html.erb

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

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

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

同时将 @reply 分配给对象变量,同时渲染'shared / error_messages'部分,

<%= 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>