如何使用控制器中的create方法填充连接表

时间:2013-12-17 13:34:13

标签: ruby-on-rails controller many-to-many

我正在尝试使用来自其他两个表的id来填充连接表,添加用户ID因为设计而相对容易,但是另一个Id在create方法中给了我一些问题。

UserItems表的id为user_id和item_id,它是两个表之间的链接,允许多对多关系。

这是代码

def create
  @user_item = UserItem.new(user_item_params)
  @user_item.user_id = current_user.id
  @user_item.item = Item.find(params[:item_id])


  if @user_item.save
    redirect_to @user_item, notice: 'successfully created.'        
  else
    render action: 'new'         
  end    
end

user_item_params也是user_items_controller.rb中的一个方法

def user_item_params
  params.require(:user_item).permit(:item_id, :user_id)
end

这一行

  @user_item.item = Item.find(params[:item_id])

是我认为我错了的行,我不认为它用正确的项目ID填充表格。

我是通过测试驱动开发来实现的,如果给定user_item的用户或项目不存在,则当前失败的测试应该得到404。由于在未找到这些项目时会自动呈现404,因此添加这些代码行应该可以解决这个问题。但他们不是。

我在代码中设置了正确的关系,我不想用完整的控制器弄乱这个问题。

一如往常,非常感谢任何帮助,感谢您的时间。

2 个答案:

答案 0 :(得分:0)

您没有向我们展示任何错误消息或展示了什么不起作用,但是从代码中跳出了许多突出点。

  1. 您不经常直接更新联接表,通常您会执行current_user.items << @item
  2. 之类的操作
  3. 您似乎没有初始化@item任何地方
  4. 如果您使用UserItem创建新的user_item_params,则如果您的参数正确,则无需手动分配属性
  5. 真正有用的是知道你的params哈希究竟是什么样的,以了解你实际发布的内容。

答案 1 :(得分:0)

如果您有一个名为Item的模型,并且您定义了关联

,则可以使用
@user_item.item = Item.find(params[:item_id])

,否则

@user_item.item_id = Item.find(params[:item_id]).id