创建可在Rails中的多个控制器中定义和访问的变量

时间:2012-01-07 22:46:02

标签: ruby-on-rails ruby ruby-on-rails-3 model-view-controller static-variables

我正在创建一个用于创建多个待办事项列表的应用。因此,用户登录,具有多个列表,并且每个列表包含多个项目。其他一切都在运作,但我正在努力创造这些物品。

我在列表中创建新项目的代码(可在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中。

2 个答案:

答案 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存在且它指向的列表存在。