Форма визуализации частичная в другом контроллере (не вложенном)
У меня есть две модели, сгенерированные с помощью строительных лесов, одна из которых - LogBook, другая - LogEntry. Я хочу, чтобы формальная форма для LogEntry отображалась на странице показа LogBook. Когда я вызываю рендеринг на частичном, я получаю эту ошибку:
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 %>
Ответы
Ответ 1
Вы можете отобразить все, что хотите, до тех пор, пока вы укажете его путь из папки просмотра:
<%= render :partial => '/log_entries/form', :log_entry => @log_book.log_entries.build %>
Ваш путь должен начинаться с символа /, чтобы Rails
знаете, что вы относитесь к папке вида.
В противном случае предполагается, что он относится к вашей текущей папке.
Как побочный элемент, полезно избегать использования переменных экземпляра в частичном, вы сделали это правильно.
Только что у вас есть ошибка в вашей частичной форме:
:Text
Не должно быть допустимого имени столбца вашей модели. Попробуйте: текст
Ответ 2
Попробуйте переключить метод рендеринга следующим образом:
<%= render :partial => 'log_entries/form', :log_entry => @log_book.LogEntries.new %>
Использование только рендеринга выполняется при передаче переменной экземпляра объекта. Однако, поскольку вы указываете файл, лучше использовать эту опцию.