2011-01-04 10 views
7

Ich versuche, meine Bearbeitungsaktion etwas mehr bedingte Logik hinzuzufügen, indem ich params in ein where übergebe.Simple_form Error - undefinierte Methode `model_name 'für ActiveRecord :: Relation: Klasse

Jedes Mal, wenn ich etwas anderes als .find (params [: id], wird der Fehler nicht definierte Methode `model_name‘ für Active :: Relation: Klasse

Mein Code ist unten

Controller:

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

Ausblick:

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

ich die Klasse für @ Büro ausgegeben, die ist ActiveRecord :: Beziehung. Wenn ich nur

verwenden, ist die Ausgabe Office.

Ich denke, das ist das Problem, aber ich weiß nicht, wie es zu beheben ist. Irgendwelche Ideen?

Antwort

16

Das Formular ein einzelner Datensatz erwartet in der @office Instanz variabel zu sein, der where -Methode gibt keinen einzigen Datensatz, sondern eine Beziehung, die mehrere Datensätze sein kann, einmal abgefragt.

Der richtige Weg ist:

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

Oder noch besser, wenn Sie die Beziehung definiert haben:

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

Große, sie arbeiten! Der zweite ist schön und sauber, also habe ich das benutzt. Danke für Ihre Hilfe. –

+0

haben getan. Prost –

+1

Großartige Erklärung - Sie haben nicht nur Code zur Beantwortung der Frage bereitgestellt, Sie haben auch erklärt, WARUM es so funktioniert. Sehr hilfreich! –

4

Ich hatte auch das gleiche Problem, das ich es .first unter Verwendung festgelegt.

ähnlich wie diese:

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