web-dev-qa-db-ja.com

別のコントローラー(ネストされていない)でフォームの一部をレンダリングする

生成スキャフォールディングで生成された2つのモデルがあります。1つはLogBookで、もう1つはLogEntryです。 LogBookの表示ページでLogEntryのフォームを部分的にレンダリングしたいと思います。パーシャルでrenderを呼び出すと、次のエラーが発生します。

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 %>
15
vfilby

ビューフォルダからのパスを指定する限り、必要な部分をレンダリングできます。

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

パスは/で始まる必要があります。これにより、Railsは、ビューフォルダからの相対パスであることを認識できます。

それ以外の場合は、現在のフォルダーに関連していると見なされます。

補足として、インスタンス変数を部分的に使用しないようにすることをお勧めします。その時点で使用しました。

パーシャルの形式にエラーがあるのを確認しました。

 :Text

モデルの有効な列名であってはなりません。 :textを試してください

38
apneadiving

次のようにレンダリングメソッドを切り替えてみてください。

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

オブジェクトのインスタンス変数を渡すときに、レンダリングのみを使用すると機能します。ただし、ファイルを指定しているため、このオプションを使用することをお勧めします。

2
agmcleod