2011-01-04 14 views
7

Sto cercando di aggiungere qualche altra logica condizionale all'azione di modifica passando i parametri in un punto.Errore Simple_form - metodo non definito `nome_modello 'per ActiveRecord :: Relazione: Classe

Ogni volta che uso qualcosa di diverso da .find (params [: id], l'errore non definito metodo `MODEL_NAME' per ActiveRecord :: Relation: Classe

mio codice è sotto

Controller:

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

ho outputted la classe per @office che è ActiveRecord :: Relazione. Se uso solo

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

l'output è Office.

Penso che questo sia il problema ma non so come risolverlo. Qualche idea?

risposta

16

Il modulo si aspetta che un singolo record sia nella variabile di istanza @office, il metodo where non restituisce un singolo record ma una relazione, che può essere più record, una volta interrogata.

Il modo corretto è:

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

O meglio ancora, se avete definito la relazione:

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

Grande, funzionano! Il secondo è bello e pulito, quindi l'ho usato. Grazie per l'aiuto. –

+0

hanno fatto. Cheers –

+1

Ottima spiegazione: non hai appena fornito il codice che ha risposto alla domanda, hai anche spiegato PERCHÉ funziona come fa. Molto utile! –

4

Ho anche avuto lo stesso problema ho riparato utilizzando .first.

simile a questo:

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