2016-06-01 2 views
2

は、だから私は、次があるQuestion#Show.html.erbを持っている:これは正常に動作しますローカル変数を同じビューの別の部分からハイジャックすることを防ぐ方法を教えてください。

<% @question.answers.each do |ans| %> 
    <%= render partial: "questions/answer", locals: {ans: ans} %> 
    <% end %> 

    <div class="row"> 
    <div class="col-lg-8 col-lg-offset-2"> 
     <div class="ibox"> 
      <div class="ibox-title"> 
       <h5>Your Refactor Suggestion</h5> 
      </div> 

      <div class="ibox-content"> 
      <%= render partial: "answers/form", locals: {answer: @question.answers.build(user: current_user)} %> 
      </div> 
     </div> 
    </div> 
    </div> 

ただし、一度反転すると(つまり、上部にあるイテレータの下に現在あるdiv.class=rowを置いてください)、狂ったエラーが発生します。例えば

、これをやって:

<div class="row"> 
    <div class="col-lg-8 col-lg-offset-2"> 
     <div class="ibox"> 
      <div class="ibox-title"> 
       <h5>Your Refactor Suggestion</h5> 
      </div> 

      <div class="ibox-content"> 
      <%= render partial: "answers/form", locals: {answer: @question.answers.build(user: current_user)} %> 
      </div> 
     </div> 
    </div> 
    </div> 

    <% @question.answers.each do |ans| %> 
    <%= render partial: "questions/answer", locals: {ans: ans} %> 
    <% end %> 

は、このエラーにつながる:ここ

ActionController::UrlGenerationError at /questions/42 
No route matches {:action=>"vote_up", :controller=>"answers", :id=>nil} missing required keys: [:id] 

は(簡潔にするために切り捨て)私のquestions/_answer.html.erb部分である:ここでは

 <%= link_to vote_up_answer_path(ans), method: :post do %> 
      <i class="fa fa-chevron-up"> </i> 
     <% end %> 
     <%= ans.cached_votes_total %> 
     <%= link_to vote_down_answer_path(ans), method: :post do %> 
      <i class="fa fa-chevron-down"> </i> 
     <% end %> 
      <%= ans.body %> 
         <%= link_to ans.user.try(:email), user_path(ans.user) %> 

は私ですanswers/_form.html.erb部分(簡略化のために切り捨てられている):

<%= simple_form_for(answer) do |f| %> 
    <%= f.error_notification %> 
    <%= f.input :question_id, as: :hidden %> 
    <%= f.input :user_id, as: :hidden %> 
    <div class="form-group"> 
    <%= f.input_field :body, as: :text, class: "form-control", rows: 8 %> 
    </div> 
    <div class="form-group"> 
    <%= f.input_field :language, collection: ["ruby", "python", "php"], as: :select, selected: "ruby", class: "form-control" %> 
    </div> 

    <div id="new-post-submission-button"> 
    <%= f.button :submit, class: "btn btn-lg btn-primary pull-right" %> 
    </div> 
<% end %> 

これは私のQuestions#Showコントローラです:

def show 
    @question = Question.includes(:answers).find(params[:id]) 
    end 

その奇妙な行動を引き起こしている可能性がありますか?

+0

が、これは* Railsの5 *との特定の問題ですか? * Rails 4.x *でこれを試しましたか? – Pavan

+0

@Pavan私はこれをRails 4.xでテストしていません。私はRails 5を使ってアプリケーションを構築していますので、問題が発生している場所です。 – marcamillion

答えて

2

私は問題が(コードのこの部分のように)を最初にに組み込んでいると思います:この部分は@question.answers.build(user: current_user)です。 buildは、新しい関連オブジェクト(回答)を構築し、その外部オブジェクトのリンクを主オブジェクト(質問)に設定し、関連付けコレクション(質問のすべての回答)に追加します。しかし、それはまだそれを保存しないので、実際にIDはまだありません。

質問の回答の関連付けのすべてのメンバーの部分的な次の部分をレンダリングすると、上からの新しく作成された回答も含まれます。パーシャルをレンダリングするときは、新しく作成したアンサーをスキップする必要があります。 更新:はこれを行うには、次の(同じことを達成するための多くの方法がありますが、これは単なる一例である)のような何かを行うことができます:

@question.answers.select { |ans| ans.persisted? }.each do |ans| 
    ... 
end 
+0

興味深い。 IDがない場合、新しく作成された回答をスキップするにはどうすればよいですか?レコードが保存されていないので、「Answer.last」やそのようなことはできません...そうですか?どのようにすればよいのかというコードの例がありますか?ありがとう! – marcamillion

+0

回答コレクションをトラバースするときは、新しく作成したレコードを単にスキップできます。例については、回答の更新を参照してください。 – BoraMa

+0

パーフェクト。魅力のように動作します。ありがとう! – marcamillion

関連する問題