2009-12-02 37 views
6

Aquí está la llamada en el archivo application.html.erb:Problema representación parcial en el diseño de la aplicación (rieles)

<%= render :partial => 'tasks/_new' %> 

Aquí está el parcial que se queden (_new.html.erb):

<% form_for @task do |f| -%> 
    <%= f.text_field :body %> 
    <%= submit_tag "Submit" %> 
<% end -%> 

Aquí es el método en el ' controlador de tareas:

def new 
    @task = Task.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @task } 
    end 
end 

Aquí está el mensaje de error que sigo recibiendo:

Missing template tasks/__new.erb in view path app/views 

y dice que el error está en esta línea:

<%= link_to "tasks", tasks_path %> <%= render :partial => 'tasks/_new' %> 

El archivo está en el directorio correcto. Lo extraño es que hay un extra _ en el nombre del archivo, en el error. Cuando ceder y cambiar el nombre del parcial a __new.erb, aquí está el error que consigo:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id 

Y dice que el error está en esta línea:

<% form_for @task do |f| -%> 

También había intentado sin el _ en el código, como sugirió Petros, pero devuelve el mismo error que el anterior, Called id for nil….

¿Qué está pasando?

Respuesta

9

No necesita el _ en su código. Debe ser:

<%= render :partial => 'tasks/new' %> 

El primer error se debe a que no necesita poner _ dentro del parámetro: partial. Rails se ocupa de eso. Es por eso que tienes doble __ porque Rails te pondrá uno.

El segundo error es su problema real. El error sugiere que @task es nulo. Esto es cierto porque el parcial solo sabe lo que conoce la vista de contenedor, y su vista en ese momento particular no ha llamado la acción desde el controlador apropiado. Como usted (Baby Diego) ya descubrió e indicó en uno de sus comentarios a continuación, necesita crear una instancia de una Tarea en su parcial. No sé si hay una solución más elegante, pero tal vez alguien pueda sugerir algo mejor en el futuro.

Gracias a MattMcKnight por informarnos que el parcial solo sabe lo que sabe la vista del contenedor.

+0

Disculpa, debería haberlo especificado. Intenté eso también. Devolvió el error "identificó id for nil". Voy a arreglar el OP. –

+0

Puede intentar <% = render: partial => 'tasks/new', locals => {: task => @task}%> ... Es posible que necesite cambiar @task a la tarea en su código parcial o agregar en la parte superior de la tarea parcial <% @task = task if @task == nil%> – Petros

+0

Intenté hacer que eso funcionara pero no pude. Me ayudaste a darme cuenta de que el problema era que no había ninguna instancia de '@task' llegando al diseño de la aplicación, ya que está vinculada al controlador de tareas, así que probé "<% form_for Task.new do | f | -%>" y funcionó. Pero se siente como un truco. ¿Es el enfoque correcto? –

4

Petros identificó correctamente el primer problema: no necesita el guión bajo en la llamada parcial. Lo segundo que debe saber sobre los parciales es que no llaman al método del controlador, solo hacen referencia a la vista. Por lo tanto, debe configurar el objeto @task en cada acción que utiliza ese parcial, o simplemente llamar a Task.new en el parcial. Cuando tengo un parcial en un diseño en situaciones similares, generalmente lo cargo con JavaScript para que pueda llamar a la acción.

+0

Lo estoy llamando desde el diseño de la aplicación, la acción que utiliza el parcial sería algo en el controlador de la aplicación, ¿verdad? Aparte de eso, usar "<% form_for Task.new do | f | -%>" no es un hack? –

+0

Gracias MattMcKnight por informarnos que un parcial solo sabe lo que sabe la vista del contenedor. Edité mi respuesta para ser más preciso. – Petros

+0

No es un truco para llamar a un método de clase en un modelo. Llamar <% tasks = Task.find (: all,: conditions => "complete = false")%> en el parcial estaría cerca de un hack. Creo que un concepto clave que algunas personas no entienden en Rails es que solo se llama a una acción (también conocido como método de controlador). – MattMcKnight

1

Si las necesidades parciales saber acerca de una variable en el archivo erb llamada, puede pasar de esta manera:

<%= render partial: "tasks/new", locals: { task: @task } %> 

Y en el archivo app/views/tasks/_new.html.erb, consulte la variable así:

<% form_for task do |f| %> 
    <%= f.text_field :body %> 
    <%= submit_tag "Submit" %> 
<% end %> 

Es decir, sin el @. (El código a: b es simplemente una forma más conveniente de :a => b.)

Me pregunto, sin embargo, ¿por qué desea utilizar parciales en el archivo application.html.erb? Supongo que se refiere al archivo generado por Ruby app/views/layouts/application.html.erb, que se supone que debe usarse como un archivo de diseño que contiene elementos comunes a todas las páginas de su aplicación, no para la lógica comercial. ¿Quizás el archivo que necesita para llamar al parcial es app/views/tasks/index.html.erb?

Cuestiones relacionadas