2011-05-31 33 views
15

Tengo dos modelos generados con generar andamios, uno es un LogBook y el otro es LogEntry. Quiero hacer que el formulario sea parcial para LogEntry en la página show de LogBook. Cuando llamo a hacer en el parcial consigo este error:Renderizar formulario parcial en un controlador diferente (no anidado)

undefined method `model_name' for NilClass:Class 

supongo que es porque el _form predeterminada utiliza una variable de instancia que no está presente cuando se llama desde un controlador separado. Así que traté de convertir LogEntry _form.html.erb para usar variables locales y las pasé a través de la llamada de renderizado. Después de esto aquí es el error:

Model LogEntry does not respond to Text 

¿Cómo puedo incluir este parcial en la página muestran formar un controlador diferente?

Modelos:

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 (usando la variable local):

<%= 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 %> 

Respuesta

36

Puede hacer lo que sea parcial que desee, siempre y cuando le dan su ruta de la carpeta de vista:

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

Su ruta debe comenzar con un/a permitir que los carriles te conocen son relativas a la carpeta vista .

De lo contrario, se supone que es relativo a su carpeta actual.

Como nota al margen, es una buena práctica evitar el uso parcial de variables de instancia, lo hizo en ese momento.

Sólo visto que tiene un error en su formulario de parcial:

:Text 

no debe ser un nombre de columna válido de su modelo. Intente: texto

+0

Fue el: Error de texto que causaba el problema, ¡gracias! – vfilby

+0

@apneadiving cuando se envía el formulario, ¿se utilizaría el controlador de entradas de registro? – BKSpurgeon

2

Trate de cambiar el render método de la siguiente manera:

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

El uso de solo render funciona al pasar una variable de instancia del objeto. Sin embargo, como está especificando un archivo, es mejor usar la opción.

Cuestiones relacionadas