2016-06-01 6 views
2

So habe ich eine Question#Show.html.erb, die Folgendes hat:Wie verhindere ich, dass ein Teil die lokalen Variablen von einem anderen in derselben Ansicht entführt?

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

Dies funktioniert gut.

Aber sobald ich es umdrehen (d. H. Setzen Sie die div.class=row, die derzeit am unteren Rand über dem Iterator an der Spitze ist), bekomme ich einige verrückte Fehler.

Zum Beispiel dies zu tun:

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

führt zu diesem Fehler:

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

Hier ist meine questions/_answer.html.erb Teil (abgeschnitten der Kürze halber):

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

Hier ist mein answers/_form.html.erb teilweise (auch verkürzt):

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

Das ist mein Questions#Show Controller:

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

was das seltsame Verhalten verursacht sein könnte?

+0

Ist das ein spezifisches Problem mit * Rails 5 *? Hast du das auf * Rails 4.x * probiert? – Pavan

+0

@Pavan Ich habe dies nicht auf Rails 4.x getestet. Ich baue meine App mit Rails 5 auf, sodass ich dort das Problem erlebe. – marcamillion

Antwort

2

Ich denke, dass das Problem in Aufbau der zugehörigen Antwort zuerst ist (wie in diesem Teil des Codes: @question.answers.build(user: current_user)). build erstellt ein neues Assoziationsobjekt (Antwort), setzt den Fremdschlüssel-Link auf das Hauptobjekt (Frage) und fügt ihn der Zuordnungssammlung (allen Antworten der Frage) hinzu. Aber es speichert es noch nicht, also hat es ja noch keine ID.

Also, wenn Sie Ihre teilweise nächste für alle Mitglieder der Frage Antworten der Assoziation rendern, enthält dies auch die neu erstellte Antwort von oben. Sie sollten die neu erstellte Antwort beim Rendern der Teiltöne wahrscheinlich überspringen. Update: Um dies zu tun, können Sie so etwas tun die folgende (es gibt viele Möglichkeiten, um das gleiche zu erreichen, dies ist nur ein Beispiel):

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

Interessant. Wie überspringe ich die neu erstellte Antwort, wenn sie keine ID hat? Ich kann 'Answer.last' oder so etwas nicht tun, weil der Datensatz nicht gespeichert wird ... oder? Hast du ein Beispiel dafür, wie ich das machen könnte? Vielen Dank! – marcamillion

+0

Sie können den neu erstellten Datensatz überspringen, wenn Sie die Antworten-Sammlung durchlaufen. Ein Beispiel finden Sie in der Antwortaktualisierung. – BoraMa

+0

Perfekt. Klappt wunderbar. Vielen Dank! – marcamillion

Verwandte Themen