嵌套属性不保存连接表中的user_id

时间:2011-10-12 13:32:10

标签: ruby-on-rails associations nested-attributes

管理主控制器:

def new
  @admin = Admin.new
  @invitation = @admin.invitations.build
  @admi.user_admin_relationships.build
end

def create
  params[:invitation][:sender_id] = current_user.id
  @admin = Admin.new(params[:admin])
  if @admin.save
    redirect_to root_path
  else
    render 'new'
  end
end

邀请模式

belongs_to :admin
belongs_to :user

管理模式

has_many :invitations
has_many :user_admin_relationships
has_many :users, :through => :user_admin_relationships

accepts_nested_attributes_for :invitations
accepts_nested_attributes_for :user_admin_relationships, :allow_destroy => true

用户模型

has_many :invitations
has_many :user_admin_relationships
has_many :admins, :through => :user_admin_relationships

我的表单是嵌套表单,可以正常保存表单和created_atsent_at等字段的字段。 但是,它不会保存user_id(user_admin连接表)和sender_id(邀请表)。

我尝试向管理控制器添加不同的排列,但没有任何效果。

不起作用的事情:

params[:invitation][:sender_id] = current_user.id

这给了我一个零对象,当我没想到它出错时。

params[:invitation].merge!(:sender_id = current_user.id)

这给我一个“错误的语法错误”

@admin.invitations.build(params[:invitation][:sender_id]) = current_user.id

这给了我意想不到的“=”和“期待关键字结束”错误

我也试过了一堆其他不同的排列。我的协会有问题吗?如何更新邀请表中的sender_id和富连接user_admin_relationship表中的user_id?我知道我可以通过hidden_field来做,但听说它不安全所以我不想这样做。

1 个答案:

答案 0 :(得分:1)

使用:

params[:invitation].merge!(:sender_id => current_user.id)

注意=>,而您只有=。但是,在您的create操作中,您要将其添加到params[:invitation],但之后您无法将其保存在任何位置,因此它只是迷路了。您可能想要使用:

params[:admin][:invitations_attributes][:sender_id]

此外,您正在存储sender_id,但您没有任何要告诉您的用户模型查找sender_id作为外键的内容。默认情况下,它会查找user_id。你必须添加这个:

User: has_many :invitations, :foreign_key => 'sender_id'

和其中之一:

Invitation: belongs_to :sender, :class_name => "User" # recommended
# or 
Invitation: belongs_to :user, :foreign_key => 'sender_id'