Rails Partial: неопределенная локальная переменная

Рельсы использую нечасто, так что простите, если это очевидно. Я рассмотрел другие вопросы, я работаю с Ruby On Rail Guide, и похоже, что я делаю это правильно, но я все еще не могу заставить работать мои локальные переменные.

todays / show.html.erb

<p>
  <strong>Tasks:</strong>  
  <%= render partial: "next_steps/next_step_today", 
        collection: @today_lines %>
</p>

next_steps / _next_step_today.html.erb

  <p>
    <%= render partial: "next_steps/next_step",
            locals: {next_step: today_line.next_step} %>
    <%= link_to 'x', today_line, method: :delete, data: { confirm: 'Are you sure?' } %>
  </p>

next_steps / _next_step.html.erb

<span class="<%= next_step.complete ? "completed_next_step" : ""%> next_step_span_<%= next_step.id%>">
<%= form_for(next_step, 
      :remote => true, 
      :html => {:'data-type' => 'json', 
                :multipart => true, 
                :id => "edit_next_step_#{next_step.id}_#{rand()}"}
      )  do |f| %>
    <%= f.hidden_field( :id, :value => next_step.id) %>
    <%= f.hidden_field( :note_id, :value => next_step.note_id) %>
    <%= f.hidden_field( :content, :value => next_step.content) %>
    <%= f.hidden_field( :due_date, :value => next_step.due_date) %>
    <%= f.check_box( :complete, :class => "next_step_complete_button" ) %>
    <%= next_step.content %>
<% end %>
</span>

Я знаю, что последняя часть _next_step.html.erb работала до того, как я начал пытаться добавить части для дополнительной гибкости. Теперь я не могу правильно передать местных жителей.

Мой предыдущий рабочий код был

todays / show.html.erb

<p>
<strong>Tasks:</strong> 

<% @today_lines.each do |today_line| %>
  <p><%= render today_line.next_step %></p>
<% end %>
</p>

Сообщение об ошибке

NameError в сегодняшнем # шоу

Показаны /.../app/views/next_steps/_next_step_today.html.erb, где поднята строка №3:

undefined локальная переменная или метод `today_line 'для #‹ #: 0x007f930adbd860> Извлеченный источник (около строки # 3):

<p>
  <%= render partial: "next_steps/next_step",
          locals: {next_step: today_line.next_step} %>
  <%= link_to 'x', today_line, method: :delete, data: { confirm: 'Are you sure?' } %>
</p>

Любые идеи?

РЕДАКТИРОВАТЬ: ОКОНЧАТЕЛЬНЫЙ КОД РАБОТЫ

todays / show.html.erb

<p>
  <strong>Tasks:</strong>
  <%= render partial: "next_steps/next_step_today", 
    collection: @today_lines %>
</p>

_next_step_today.html.erb

  <p>
    <%= render "next_steps/next_step",
        next_step: next_step_today.next_step %>
    <%= link_to 'x', next_step_today, method: :delete, data: { confirm: 'Are you sure?' } %>
  </p>

collection: требует, чтобы вы использовали частичное имя файла для локальной переменной.

В процессе поиска я также обнаружил, что если вы не используете partial:, вы также можете опустить locals: и просто использовать вместо этого имя переменной, что будет более чистым. Это изменение показано на _next_step_today.html.erb. Я хотел бы также назвать переменную коллекции вместо использования частичного имени файла или вместо использования каждого, но это достаточно близко и работает.


person Ken    schedule 13.10.2015    source источник


Ответы (2)


Имя переменной в партиале происходит от имени самого партиала, а не от имени коллекции.

Тогда ваш _next_step_today.html.erb должен иметь следующий вид:

<p>
  <%= render partial: "next_steps/next_step",
        locals: {next_step: next_step_today.next_step} %>
  <%= link_to 'x', next_step_today, method: :delete, data: { confirm: 'Are you sure?' } %>
</p>

Изменить: если вы хотите придерживаться соглашения @collection, то есть

person Thomas Hennes    schedule 13.10.2015

Show необходимо указать имя ключа, которое будет использовать партиал. Так:

<%= render partial: "next_steps/next_step_today", 
    today_lines: @today_lines %>

Также исправьте орфографию в партиале next_step_today:

  <%= render partial: "next_steps/next_step",
      locals: {next_step: today_lines.next_step} %>
person baron816    schedule 13.10.2015