在不同的控制器中渲染表单部分(不嵌套)

时间:2011-05-31 15:13:17

标签: ruby-on-rails ruby-on-rails-3 partials

我有两个使用生成脚手架生成的模型,一个是LogBook,另一个是LogEntry。我想在LogBook显示页面上为LogEntry渲染部分表单。当我在局部调用渲染时,我得到了这个错误:

undefined method `model_name' for NilClass:Class

我认为这是因为默认_form使用的实例变量在从单独的控制器调用时不存在。所以我尝试将LogEntry _form.html.erb转换为使用局部变量并通过render调用传递它们。在此之后是错误:

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 个答案:

答案 0 :(得分:38)

只要从视图文件夹中提供路径,就可以呈现您想要的任何部分:

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

你的路径必须以/开头让Rails开头 知道你相对于视图文件夹。

否则,它被认为是相对于您当前的文件夹。

作为旁注,避免在局部使用实例变量是很好的,你当时就做了。

刚看到你的部分形式有错误:

 :Text

不应该是模型的有效列名。尝试:文字

答案 1 :(得分:2)

尝试按如下方式切换渲染方法:

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

在传递对象的实例变量时,只使用渲染。但是,由于您要指定文件,因此最好使用该选项。