我正在尝试更改某些控制器代码。但是,我不明白把它放在哪里。
我在新的联系表单中有以下内容:
<%= 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
我仍然在选择框中找到所有位置。
答案 0 :(得分:0)
SimpleFormFor association
帮助器方法将生成一个列表(默认为选择列表,但可以修改为无线电或复选框列表),作为该关联的嵌套属性。提交时,此字段将传递给与父表单相同的控制器操作 - 在本例中为ContactsController#create
操作。
就您的自定义位置列表而言,您可以将此collection
选项传递给association
方法:
<%= f.association :location, :collection => @locations, :label_method => :name, :label => 'Location:' %>
构建此@locations
列表的实际位置将包含在可能需要访问它的任何操作中 - 包括new
和edit
,以及create
和update
(如果错误导致您的表单无法提交)。您可以使用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