2011-01-04 8 views
7

Estoy tratando de agregar algo más de lógica condicional a mi acción de edición al pasar los parámetros a un lugar.Error de forma simple - método indefinido `nombre_del_modelo 'para ActiveRecord :: Relación: clase

Siempre que uso que no sea nada .find (params [: id], el error no definido método `MODEL_NAME' de ActiveRecord :: Relation: Clase

Mi código está por debajo

controlador:

def edit 
    @office = Office.where("id = ? AND company_id = ?", params[:id], @company.id) 
end 

Vista:

<%= simple_form_for @office, :url => settings_office_path, :html => { :class => "office_form" } do |f| %> 
    <h1>Edit <%= @office.office_name %> Details</h1> 
    <%= render :partial => 'form', :locals => { :f => f } %> 
<% end %> 

que emite la clase para la que @oficina es ActiveRecord :: Relation. Si solo uso

@office = Office.find(params[:id]) 

el resultado es Office.

Creo que este es el problema, pero no sé cómo solucionarlo. ¿Algunas ideas?

Respuesta

16

El formulario espera que un solo registro esté en la variable de instancia @office, el where -metodo no devuelve un solo registro sino una relación, que puede ser registros múltiples, una vez consultado.

La forma correcta es:

@office = Office.where(:company_id => @company.id).find(params[:id]) 

O mejor aún, si ha definido la relación:

@office = @company.offices.find(params[:id]) 
+0

Grande, que funciona! El segundo es bueno y limpio, así que lo he usado. Gracias por tu ayuda. –

+0

han hecho. Cheers –

+1

Gran explicación: no solo proporcionó el código que respondió la pregunta, sino que también explicó POR QUÉ funciona de la manera en que funciona. ¡Muy útil! –

4

También tuve el mismo problema me fijo mediante el uso de .first.

similar a éste:

def edit 
    @office = Office.where("id = ? AND company_id = ?", params[:id], @company.id).first 
end 
Cuestiones relacionadas