2013-05-06 56 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

相关问题