2011-05-31 81 views
15

我有兩個使用生成腳手架生成的模型,一個是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 %> 

記錄簿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 %> 

回答

36

可以渲染你想,只要你給它從視圖文件夾路徑的任何部分:

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

你的路徑必須以/開頭,讓 知道你的Rails是相對於視圖文件夾。

否則,它被認爲是相對於您當前的文件夾。

作爲一個旁註,避免在部分中使用實例變量是一件好事,你做到了。

剛剛看到你在你的部分的形式的錯誤:

:Text 

不應該是你的模型有效的列名。請嘗試:文本

+0

原來是這樣的:文本錯誤導致了問題,謝謝! – vfilby 2011-05-31 17:45:34

+0

在提交表單時,@apneadiving會使用日誌條目控制器嗎? – BKSpurgeon 2016-08-11 04:52:43

2

嘗試切換渲染方法如下:

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

傳遞對象的實例變量時只使用渲染即可。但是,由於您指定了一個文件,因此最好使用該選項。