【问题标题】:rails 4 has_many :through not saving associationsrails 4 has_many :通过不保存关联
【发布时间】:2013-11-24 06:58:03
【问题描述】:

我有 2 个具有多对多关联的模型,如下所示:

class User < ActiveRecord::Base
    has_many :remark_users, :dependent => :destroy
    has_many :designated_remarks, :through => :remark_users, :source => :remark
end

class Remark < ActiveRecord::Base
     has_many :remark_users, :dependent => :destroy
    has_many :users, :through => :remark_users

    accepts_nested_attributes_for :users
end

和关系:

class RemarkUser < ActiveRecord::Base
    belongs_to :remark
    belongs_to :user
end

应该执行保存的remarks_controller 操作:

# PATCH Save users
def save_users
    @remark = Remark.find(params[:id])
    @remark.users.build(params[:remark_user_ids])
    @remark.save
end

还有形式:

<%= form_for @remark, :url => salveaza_responsabili_remark_path(@remark) do |f| %>
    <% @users.each do |user| %>
        <%= check_box_tag 'remark[remark_user_ids][]', user.id, @remark.users.include?(user) %>
        <%= user.name %>
    <% end %>
    <%= hidden_field_tag 'remark[remark_user_ids][]', '' %>
<% end %>

备注控制器:

params.require(:remark).permit(:description, :suggestion, :origin_details,  process_type_id, :origin_id, :remark_user_ids)

用户和备注都已经存在,我需要一个表单来创建关联,最好使用复选框。

在控制台中,关联被保存。但我花了最后一天试图让它在浏览器中工作。我已经阅读了所有关于这个问题的信息,我现在很困惑。

有人能告诉我实际的表单应该是什么样子吗,以及是否需要在控制器中添加任何其他内容?

【问题讨论】:

  • 你收到@remark.users #=&gt; [] ?
  • 我不确定你的意思。你能解释一下吗?我是新来的轨道。谢谢!

标签: ruby-on-rails has-many-through has-many strong-parameters


【解决方案1】:

您的表单没有问题,但可以简化为以下内容

<%= form_for @remark, :url => salveaza_responsabili_remark_path(@remark) do |f| %>
  <% @users.each do |user| %>
    <%= check_box_tag 'user_ids[]', user.id, @remark.users.include?(user) %>
    <%= user.name %>
  <% end %>
<% end %>

然后在您的控制器中,您可以期待来自params[:user_ids] 的数组

def save_users
  @remark = Remark.find(params[:id])

  # This is where you need to think about things.  If the checkbox in the form
  # contains all the users for a remark, the following code should work.
  #
  # @remark.user_ids = params[:user_ids]
  # @remark.save
  # 
  # otherwise, you have to loop through each user_id
  params[:user_ids].each do |user_id|
    @remark.remark_users.create!(user_id: user_id)
  end
end

【讨论】:

  • 谢谢!它开始起作用,它节省了用户。但是当我取消选中用户时,它不会从加入表中删除关联。我在表单中添加了一个隐藏字段:&lt;%= hidden_field_tag 'user_ids[]', '' %&gt;.
  • 终于搞定了!起初我不明白你所说的 redirect_to root_path 是什么意思,但现在我明白了。它就像一个魅力!
猜你喜欢
  • 2016-08-24
  • 1970-01-01
  • 2015-12-13
  • 2015-11-16
  • 2014-12-16
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多