【问题标题】:Rails-Has_many relationships not saving user or group idRails-Has_many 关系不保存用户或组 ID
【发布时间】:2016-10-17 11:37:02
【问题描述】:

我有一个与分配模型绑定的用户和组模型。一个用户 has_many 个组和一个组 has_many 个用户。但是,当我创建一个新组时,当我执行Group.last.users.count 时,输出为 0 或 ActiveRecord::Associations::CollectionProxy []。我是否需要更改我的 simple_form 的某个方面?我没有正确构建中间人模型来绑定用户和组吗?我希望这样当用户创建一个组时,group_ids 在执行User.last.groups 等操作时位于数组中。当我将它作为用户 has_many 组和组属于_to 用户时,组 id 将绑定到用户.但自从两个模型都切换到 has_many 并引入了 Assignments 模型后,情况就不再如此了。

组模型

class Group < ActiveRecord::Base
  validates :user_id, presence: true   

  has_many :assignments
  has_many :users, through: :assignments
  has_many :posts
  has_many :attachments
  has_secure_token

end

用户模型

class User < ActiveRecord::Base
 ...
 has_many :assignments
 has_many :groups, through: :assignments
 accepts_nested_attributes_for :assignments
 ...

分配模型

class Assignment < ActiveRecord::Base
  belongs_to :group
  belongs_to :user

  accepts_nested_attributes_for :group
  accepts_nested_attributes_for :user
end

组控制器

class GroupsController < ApplicationController
    before_action :authenticate_user!

def new
    @group = current_user.groups.build
end

def create
    @group = current_user.groups.build(group_params)
    @group.user_id = current_user.id
    if @group.save
        redirect_to groups_path
    else
        render :new
    end
end

private

  def group_params
    params.require(:group).permit(:group_name, :description, :user_id)
  end

end

组new.html.erb

<%= simple_form_for @group do |f| %>
  <%= f.input :group_name %>
  <%= f.text_area :description %>
  <%= f.button :submit %>
<% end %>

【问题讨论】:

  • 我强烈建议您在 rails 控制台中尝试一下,看看您是否遇到任何错误。
  • 群组has_many 用户但拥有user_id 属性?这似乎不对
  • 这就是 Group.last.users ` => #<:associations::collectionproxy> ` 和 User.last.groups ` => #<:> `

标签: ruby-on-rails


【解决方案1】:

你可以这样做:

我猜build 方法似乎没有保存您可以使用new 的连接器模型。有问题here

因为GroupUser 之间存在多对多关系。因此,组中不需要user_id。因此验证是不必要的。这会导致我的第一种方法出现问题。在模型注释中验证。 # validates :user_id, presence: true

def create
    @group = current_user.groups.new(group_params)
    # @group.user_id = current_user.id // this line is unnecessary
    if @group.save
        redirect_to groups_path
    else
        render :new
    end
end

或者,(我不建议这样做,因为这不是一个好方法)

def create
    @group = Group.new(group_params)
    if @group.save
        current_user.groups << @group
        redirect_to groups_path
    else
        render :new
    end
end

【讨论】:

  • 尝试了新的,但仍然没有运气。我的 form_for 中是否缺少某些内容?
  • @user3318660,你在group_params得到的参数是什么?编辑答案。
  • 这就是我的def group_params params.require(:group).permit(:group_name, :description, :user_id) end
  • @user3318660,您检查了更新的答案吗?另外,当您提交 form 以创建新组时,控制台日志中会写什么?
  • 哦,这就是问题所在。我删除了验证,所以现在您的第二个解决方案可以使用 def create @group = Group.new(group_params) if @group.save current_user.groups &lt;&lt; @group redirect_to groups_path else render :new end end
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多