1

私は次のものを持っています:

ルート.rb:

  resources :posts do
    resources :replies
  end

reply_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

create メソッドのelseセクションでは、post_path(@post) をリダイレクトするのではなく、post_path(@post) をレンダリングする必要があります。

作成セクションの他の部分でこれを試してください

render :template => 'posts/show'

現在の@replyオブジェクトがエラー メッセージに対して保持されるようにします。

redirect_to post_path(@post)は、show アクションで@replyオブジェクトを再定義します (そこで @reply オブジェクトを定義したと仮定します)。

posts/showアクションで、そこに返信オブジェクトを作成し、それを @reply インスタンス オブジェクトに割り当てます。

@reply = @post.replies.build

現在、reply/_form.html.erbにあります:

@post.replies.build を @reply に変更します

すなわち

<%= 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 に答える