nat*_*ess 3 has-many ruby-on-rails-4
给定Problem和Observer型号:
class Problem < ActiveRecord::Base
has_many :observers
accepts_nested_attributes_for :observers
end
class Observer < ActiveRecord::Base
belongs_to :problem
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
我试图用来form_for选择用户作为观察者:
<%= f.fields_for :observers do |obs| %>
<%= obs.collection_select(:user_id, Users.to_a, :id, :name, {:include_blank => true, include_hidden: false}, {:multiple => true}) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
但是,Rails会为select:生成错误的名称problem[observers_attributes][0][user_id][],因此即使为strong_params({:observers_attributes => [{:user_id => []}]})创建规则,它也会创建错误的关系,只有problem_id会转到数据库,并且所有user_id都会被忽略.
我要做的是向所有用户显示多个select,抓取ID并在Problem#new方法中为它们创建关联.
更新12.10
发布参数:
参数: {"utf8"=>"?", "authenticity_token"=>"NHDl/hrrFgATQOoz9A3OLbLDAbTMziKMQW9X1y2E8Ek=", "problem"=>{"problem_data_attributes"=>{"title"=>"safasfasfafsasf", "description"=>""}, "observers_attributes"=>{"0"=>{"user_id"=>["5", "8"]}}}}
强大的参数:
def problem_params
params.require(:problem).permit({:files_attributes => [:attach_id]}, {:observers_attributes => {:user_id => []}}, {:problem_data_attributes => [:title, :description]})
end
Run Code Online (Sandbox Code Playgroud)
创建方法
def create
@problem = @project.problem.build(problem_params)
@problem.account = current_account
if @problem.save
render :json => {status: true, id: @problem.id}
else
respond_with(@problem)
end
end
Run Code Online (Sandbox Code Playgroud)
在创建调用期间创建观察者的SQL:
SQL (0.2ms) INSERT INTO `observers` (`problem_id`) VALUES (96)
Run Code Online (Sandbox Code Playgroud)
按照你的方式,你说你只想要一个拥有多个user_id的观察者,实际上你想要的是每个用户一个观察者(和问题).
您应该使用这样的关联模型:http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association
请记住在您的案例模型ProblemUser和table problems_users中按字母顺序创建关联.
然后,你可以像这里一样做表格:https://stackoverflow.com/a/9917006/1217298 - 请阅读问题和答案,以便更好地理解.
希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
3747 次 |
| 最近记录: |