2010-09-17 104 views
0

對不起,如果這個問題看起來很簡單,我對Rails(幾天前剛剛開始學習)非常陌生,但在諮詢Google和「使用Rails進行敏捷Web開發」之後,我找不到答案。Rails外鍵問題

我在使用Rails 2.3.8在兩個模型上創建外鍵時遇到了問題。我的表格看起來像這樣:

cars         manufacturer 
----         ------------ 
car_make        name 
car_model       country 
car_class       logo_url 
image_url       (and default 'id' created by Rails) 
manufacturer_id 
(and default 'id' created by Rails) 

我'car_make'和'name'字段基本相同;每一輛我創造的汽車,我都希望能夠將它與現有的製造商聯繫起來。這是我嘗試創建FK的列。

我的car.rb有'belongs_to:製造商',而我的manufacturer.rb有'has_many:汽車'來建立一個製造商與很多汽車的關係。但是,當我創建一輛新車時(通過腳手架),manufacturer_id字段爲空。

我去了我cars_controller,發現正在使用的「創造」的方法,並嘗試添加下面第二行:

@car = Car.new(params[:car]) 
@car.manufacturer_id = car.manufacturer.id # <=== 

這將產生一個「NameError在CarsController#創建」錯誤,並我看到:

undefined local variable or method 'car' for #<CarsController:0x1034642f0> 

Rails似乎不喜歡我添加的行。我錯過了什麼來完成這項工作?

回答

0

那麼,你需要有一個製造商可用,然後才能將它附加到汽車。

@car = Car.new(params[:car]) 
m = Manufacturer.first # => as you can see you must already have one made 
@car.manufacturer = m 
@car.save 

原因car是未定義的,因爲,你沒有定義它。您想將哪輛車的製造商分配給@car

所以基本上你需要在製造汽車之前先做一個製造商。如果您填寫的表格中包含製造商的數據,那麼請確保將其放在一個不同的關鍵字中,例如params[:manufacturer],並對您的汽車做類似的事情。也許就像:

@car = Car.new(params[:car]) 
@manufacturer = Manufacturer.find_or_create_by_name_and_country(params[:manufacturer][:name], params[:manufacturer][:country]) 
@car.manufacturer = @manufacturer 
@car.save 
+0

啊,這是有道理的。我想找到與car_make字段對應的正確manufacturer_id。例如,如果我的製造商表格在名稱列下填充了'Acura','Honda'和'Toyota',我創建了一輛car_make'Honda'的新車,我想找到正確的manufacturer_id '本田'排。 – Anon 2010-09-17 20:25:20

+0

啊哈,所以你不應該那樣做。汽車製造應通過'car.manufacturer.name'找到,而不是在汽車上重複! – rfunduk 2010-09-17 20:32:07

+0

爲了破解它,它可以工作(*壞想法*),你可以嘗試:'@ car.manufacturer = Manufacturer.find_by_name(@ car.car_make); @ car.save',它會嘗試通過你剛剛更新的汽車的car_make字段找到製造商......如果你沿着這條路走得太遠,那麼會有一段糟糕的時間:) – rfunduk 2010-09-17 20:33:35

0

在你看來,你想生成製造商下拉列表中(我假設),那麼你應該做這樣的事情形式:

<%= collection_select(:car, :manufacturer_id, Manufacturer.all, :id, :name) %> 

然後您的create操作不需要明確設置manufacturer_id,因爲它應該從表單中接收該操作。

+0

哇這個設計還有更多直覺,想知道爲什麼我沒有想到它之前:P – Anon 2010-09-17 20:43:36