RoR:我如何在同一个控制器中使用从一个动作到另一个动作的变量?

时间:2012-01-30 09:09:43

标签: ruby-on-rails ruby-on-rails-3

在我的控制器中,我有两个操作:"Select_users""Make_something"。 在“Select_users”中,我得到一个带有用户列表的@var(这个用户是通过在同一视图中使用表单的搜索生成的),我需要为每个用户插入... ... / p>

   @var.each do |v|
     Table.create(:atribute => v.name)
   end

当我有我选择的用户列表时,我使用“提交”按钮将我发送到“Make_something”操作。

所以我想把@var变量“传递”到“Make_something”动作来进行创建,但我不能在“Make_something”中使用@var,因为它只能在“Select_users”中访问。

我读过有关过滤器的内容,但我认为他们无法帮助我解决这个问题。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用 before_filter 。在任何动作定义之前添加以下代码,即在类定义之后。

before_filter :initialize_variable, :only => [:select_users, :make_something]

这将确保method initialize_variable called whenever中的任何其他methods被调用,它将initialize { {1}}如下所示。然后你可以直接使用变量。

variable

<强> USAGES:

def initialize_variable
  @required_var = // get the details
end

def select_users
  @required_var.each //......
end

答案 1 :(得分:1)

如果您有多个方法共有的代码,请将其解压缩到另一种方法。

def select_users
  @var = go_get_those_users
end

def make_something
  go_get_those_users.each do |v| Table.create(:atribute => v.name) end
end

private
def go_get_those_users
  # do whatever you need to populate your collection
  return [] 
end

或者,您可以在发布到“make_something”的表单中传递所选用户的ID列表。或者,如果你真的想以某种方式坚持这个(我假设这是某种形式的“多步形式向导”),用户db,而不是会话 - 有一个“向导”模型保留在DB中。然后,每个步骤都会传递wizard_id,并将自己的值保存到向导中 - 这可以通过关系为您的选定用户提供正常的AR关联。

答案 2 :(得分:0)

如何保证一个动作将在另一个动作之前运行。

如果您希望该数据为特定用户保留,请将其保存在模型中。

可能有wizard模型,其中包含user_id和各个步骤的字段。

如果您希望它仅在该会话中保留,则使用session[:something]

查看http://railscasts.com/episodes/119-session-based-model