【问题标题】:Render form partial in a different controller (not nested)在不同的控制器中渲染表单部分(非嵌套)
【发布时间】:2011-09-05 14:13:41
【问题描述】:

我有两个使用 generate 脚手架生成的模型,一个是 LogBook,另一个是 LogEntry。我想在 LogBook 显示页面上呈现 LogEntry 的部分表单。当我在局部调用 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 %>

日志显示.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 %>

【问题讨论】:

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


    【解决方案1】:

    尝试如下切换渲染方法:

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

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

    【讨论】:

      【解决方案2】:

      你可以渲染任何你想要的部分,只要你从视图文件夹中给出它的路径:

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

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

      否则它被假定为相对于您当前的文件夹。

      作为旁注,最好避免在部分中使用实例变量,你当时就这样做了。

      刚刚看到您的部分表单有错误:

       :Text
      

      不应是模型的有效列名。试试:文本

      【讨论】:

      • @apneadiving 提交表单时,是否会使用日志条目控制器?
      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多