我正在创建一个用于创建多个待办事项列表的应用。因此,用户登录,具有多个列表,并且每个列表包含多个项目。其他一切都在运作,但我正在努力创造这些物品。
我在列表中创建新项目的代码(可在items_controller
中找到)是:
def create
@list =
@new_item = @list.items.build(params[:item])
if @new_item.save
flash[:success] = "Item saved!"
end
redirect_to root_path
end
问题是,我不确定如何定义@list
应该是什么。我有一个变量current_user
(基于会话)来创建一个新列表,但每个会话只有一个用户,每个会话有多个列表,所以我不能只复制那个方法。
基本上,我一直坚持如何让项目知道它属于哪个列表(应该是我刚刚在其显示页面上显示的列表)。在Java中,我有一个静态变量,每次进入列表时我都会重新定义,但是我尝试这样做并且它不起作用,而且我看起来显然是在无效的rails中。
答案 0 :(得分:1)
listItem应该具有列表模型的外键,列表模型应该具有该帐户的外键。通过这种方式,您应该能够轻松地遍历结构。
class ListItem < ActiveRecord::Base
belongs_to :list
end
class List < < ActiveRecord::Base
belongs_to :account
has_many :list_items
end
class Account < < ActiveRecord::Base
has_many :lists
end
答案 1 :(得分:1)
您应该使用url参数跟踪列表,而不是存储变量。您需要修改表单以包含list_id
参数。然后在控制器中创建列表项时,执行以下操作:
@list = List.find params[:list_id]
@new_item = @list.items.build params[:item]
或者,如果你的参数包括一个items[list_id]
参数,那么在Rails中它可以在params[:item][:list_id]
中访问,所以你应该只能这样做:
@new_item = ListItem.create params[:item]
如果以第二种方式执行此操作,请确保在ListItem模型中添加验证以确保list_id
存在且它指向的列表存在。