Rails关联 - 执行哪些控制器代码?

时间:2013-05-06 15:24:02

标签: ruby-on-rails

我正在尝试更改某些控制器代码。但是,我不明白把它放在哪里。

我在新的联系表单中有以下内容:

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

我假设代码会执行位置控制器中的索引代码。

但是,我刚刚删除了位置索引中的所有代码,并且与位置关联的联系人表单中仍然包含数据。

我希望以下代码在Contact association stmt中执行,但我不知道在哪里放置它:

@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更改为this进行测试:

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

我仍然在选择框中找到所有位置。

1 个答案:

答案 0 :(得分: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