Rails noob已经研究了几周并尝试了各种方法来做到这一点。 我正在尝试从编辑视图构建关联。我放弃了尝试从新视图(首选)构建它,因为尚未创建相关对象。我现在甚至使用Formtastic,因为我听说它“更好地处理协会”
在我的问题中,我说我很接近,因为我能够手动创建关联 - 通过使用控制器定义的对象设置连接的一端而不是用户通过表单选择的对象。请求参数正在传递,我似乎无法正确访问它们。
型号:
class Bar < ActiveRecord::Base
has_many :teams, :through => :bars_teams
has_many :bars_teams, :dependent => :destroy
accepts_nested_attributes_for :bars_teams
class Team < ActiveRecord::Base
has_many :bars, :through => :bars_teams
has_many :bars_teams, :dependent => :destroy
class BarsTeam < ActiveRecord::Base
belongs_to :bar
belongs_to :team
酒吧控制器:
def edit
@bar = Bar.find(params[:id])
@teams = Team.all
@bars_team = @bar.bars_teams.build
@title = "Edit bar"
end
def update
@bar = Bar.find(params[:id])
@team = @bars_team.team_id
@bar.follow_team!(@team)
if @bar.update_attributes(params[:bar])
flash[:success] = "Bar updated."
redirect_to @bar
else
@title = "Edit bar"
render 'edit'
end
end
来自酒吧模特 - follow_team!:
def follow_team!(team)
bars_teams.create!(:team_id => team.id)
end
为什么我认为我关闭(上面的更新行是错误的)
@team = @bars_team.team_id
我可以手动设置该行,例如@team = Team.find(49)。这成功地创建了从该栏到#49队的关联。我似乎无法从表单中抓住团队......顺便说一下,这是表格:
编辑表格:
<%= semantic_form_for (@bar) do |form| %>
<%= form.inputs :address, :city, :state, :zip_code, :phone_number, :website %>
<%= form.semantic_fields_for @bars_team do |team| %>
<%= team.input :team, :as => :select, :collection => @teams, :include_blank => false %>
<%= team.input :bar_id, :as => :hidden %>
<% end %>
<%= form.buttons %>
<% end %>
如果有人有兴趣,这里是请求参数,显示信息已通过,但我仍然不知道如何正确访问团队:
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"ECOBrnXsgMA5k2XKIiaZ7iguaIlUtj3pSHREZ683HKw=",
"bar"=>{"address"=>"",
"city"=>"",
"state"=>"",
"zip_code"=>"",
"phone_number"=>"",
"website"=>"",
"bars_team"=>{"team_id"=>"20",
"bar_id"=>"46"}},
"commit"=>"Update Bar",
"id"=>"46"}
超级长话短说,如何从表单中访问团队以设置关联?
可以帮助解决我无法从新视图创建关联的原始问题的任何人的奖励。基本上创建一个新的栏,并在创建时立即为其分配一个团队。
答案 0 :(得分:0)
尝试更改
@team = @bars_team.team_id
到
@team = Team.find(params[:bar][:bars_team][:team_id])
但整个安排不必要地复杂。
答案 1 :(得分:0)
使用fields_for
和accepts_nested_attributes_for
不是这种情况。尝试摆脱所有@bars_team的东西,并在表单中执行此操作:
<%= form.input :teams, :as => :check_boxes, :collection => @teams %>
警告:我自己从未使用过formtastic,但这是我在阅读文档后得到的。