2013-05-06 60 views
0

我試圖對某些控制器代碼進行更改。但是,我不明白該把它放在哪裏。Rails關聯 - 執行哪些控制器代碼?

我有一個新的聯繫人窗體如下:

<%= f.association :location, :label_method => :name, :label => 'Location:' %> 

我假定代碼將在該位置的控制器執行的指數代碼。

但是,我剛剛刪除了位置索引中的所有代碼,並且與位置關聯的聯繫人表單中仍然有數據。

我想下面的代碼在聯繫人關聯語句執行,但我不知道在哪裏把它:

@locations = Location.ordered_by_ancestry_and(:name).map { |l| [" " * l.depth + l.name, l.id] } 

UPDATE1

這是development.log

Processing by ContactsController#new as HTML 
Location Load (0.2ms) SELECT "locations".* FROM "locations" ORDER BY (case when locations.ancestry is null then 0 else 1 end), locations.ancestry, name 

UPDATE2

我更改了ContactsController#new以進行測試:

# GET /contacts/new 
# GET /contacts/new.json 
def new 
    @locations = Location.first 

而我仍然在選擇框中的所有位置。

+0

控制器代碼只會得到執行,並且,只有當一個鏈接之後或形式發佈情況。你是什​​麼意思「執行索引代碼」?你是否遵循'log/development.log'說什麼控制器方法正在執行? – tadman 2013-05-06 15:27:54

回答

0

的SimpleFormFor association輔助方法將生成的列表(通過默認選擇列表,而是可以被修改以無線電或複選框列表)充當該關聯嵌套屬性。提交時,此字段將傳遞給與父表單相同的控制器操作 - 在此例中爲ContactsController#create操作。

至於您的自定義的位置列表,你可以通過這個作爲collection選項給association方法:

<%= f.association :location, :collection => @locations, :label_method => :name, :label => 'Location:' %> 

實際的地方建這個@locations名單將在可能需要的任何行動訪問它 - 其中包括newedit以及createupdate(以防萬一您的表單無法提交)。您可以使用before_filter來消除任何重複。

的代碼可能看起來是這樣的:當控制器動作被觸發

class ContactsController < ApplicationController 
    before_filter :load_locations, :only => [:new, :edit, :create, :update] 

    #... actions go here 

    private 
    def load_locations 
    @locations = Location.ordered_by_ancestry_and(:name).map do |l| 
     [" " * l.depth + l.name, l.id] 
    end 
    end 
end 
+0

感謝您的幫助!我把它放在'ContactsController#create'中,我仍然有一個位置列表。 '#POST/contacts #POST /contacts.json def create @contact = Contact.new(params [:contact]) @locations = nil' – Reddirt 2013-05-06 15:39:14

+0

更新說明更好。 – PinnyM 2013-05-06 15:44:40

+0

感謝您的幫助! – Reddirt 2013-05-06 16:17:55

相關問題