Частичное отображение формы в другом контроллере (не вложенном) - PullRequest
15 голосов
/ 31 мая 2011

У меня есть две модели, созданные с помощью генерации скаффолдинга, одна - это LogBook, другая - LogEntry. Я хочу визуализировать частичную форму для LogEntry на странице шоу LogBook. Когда я вызываю render на частичном, я получаю эту ошибку:

undefined method `model_name' for NilClass:Class

Я предполагаю, что это потому, что по умолчанию _form использует переменную экземпляра, которая отсутствует при вызове из отдельного контроллера. Поэтому я попытался преобразовать LogEntry _form.html.erb для использования локальных переменных и передал их через вызов рендеринга. После этого вот ошибка:

Model LogEntry does not respond to Text

Как я могу включить эту часть в страницу шоу из другого контроллера?

Модель:

class LogBook < ActiveRecord::Base
  belongs_to :User
  has_many :LogEntries, :dependent => :destroy
end

class LogEntry < ActiveRecord::Base
  belongs_to :LogBook, :class_name => "log_book", :foreign_key => "log_book_id"
end

LogEntry _form.html.erb (с использованием локальной переменной):

<%= form_for(log_entry) do |f| %>
  <% if log_entry.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(log_entry.errors.count, "error") %> prohibited this log_entry from being saved:</h2>

      <ul>
      <% log_entry.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :Text %><br />
    <%= f.text_field :Text %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

LogBook show.html.erb:

<p id="notice"><%= notice %></p>

<p>
  <b>Name:</b>
  <%= @log_book.name %>
</p>

<%= render 'log_entries/form', :log_entry => @log_book.LogEntries.new %>



<%= link_to 'Edit', edit_log_book_path(@log_book) %> |
<%= link_to 'Back', log_books_path %>

Ответы [ 2 ]

38 голосов
/ 31 мая 2011

Вы можете визуализировать любой частичный фрагмент, если хотите указать его путь из папки представления:

 <%= render :partial => '/log_entries/form', :log_entry => @log_book.log_entries.build %>

Ваш путь должен начинаться с /, чтобы Rails знал, что вы относительно папки представления.

В противном случае предполагается, что он связан с вашей текущей папкой.

Как примечание, рекомендуется избегать частичного использования переменных экземпляра, тогда вы сделали это правильно.

Только что у вас есть ошибка в форме вашего партиала:

 :Text

Не должно быть допустимым именем столбца вашей модели.Попробуйте: текст

2 голосов
/ 31 мая 2011

Попробуйте переключить метод рендеринга следующим образом:

<%= render :partial => 'log_entries/form', :log_entry => @log_book.LogEntries.new %>

Использование just render работает при передаче переменной экземпляра объекта. Однако, так как вы указываете файл, лучше всего использовать эту опцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...