如何在控制器方法之间传递数值

7
有没有办法在控制器方法之间共享一个数组,并在页面重新加载或调用另一个控制器的方法时存储它?一些方法应该改变这个数组。
3个回答

6

您可以使用Rails缓存。

Rails.cache.write("list",[1,2,3])
Rails.cache.read("list")

1
你的方法似乎有效!我没有找到关于Rails.cache的好文档,你能提供一个链接吗? - Antiarchitect
3
不同会话具有不同的值时会发生什么? - Tony Fontenot
1
我支持Tony的观点。除非您确保在会话中list名称的唯一性,否则此解决方案将在并发请求期间失败。 - Harish Shetty
我的情况与原帖有些不同,但这个解决方案很漂亮地解决了我正在处理的问题。 - asfallows
这对我来说非常完美。我有两个控制器操作,第一个提交表单,然后重定向到第二个摘要 - 我需要获取第一个控制器创建的所有条目的ID,以便在第二个控制器的视图上呈现这些条目的摘要。我将这些ID作为数组放入实例变量中,并将其写入缓存,然后在下一个视图中读取它。谢谢! - skwidbreth

5
如果您想在同一个控制器实例的不同方法之间共享值,则需要声明一个实例变量:
class BarsController < UsersController

  before_filter :init_foo_list

  def method1
    render :method2
  end 

  def method2
    @foo_list.each do | item|
      # do something
   end
  end

  def init_foo_list
    @foo_list ||= ['Money', 'Animals', 'Ummagumma']
  end

end

如果您想在会话中的两个控制器之间共享价值,则应:
class BarsController < UsersController

  before_filter :init_foo_list

  def method1
    render :controller => "FoosController", :action => "method2"
  end 

  def init_foo_list
    params[:shared_param__] ||= ['Money', 'Animals', 'Ummagumma']
  end    
end

class FoosController < UsersController

  def method2
    params[:shared_param__].each do | item|
      # do something
   end
  end
end

为共享参数键设置唯一名称,以避免与现有键发生冲突。

另一种选择是将共享数组存储在会话中,在最终渲染之前删除它。


attr_accessor 表示我可以在整个类实例中访问这个变量。嗯...我会尝试一下!谢谢! - Antiarchitect
1
before_filter 中设置数值。 - Harish Shetty
1
未能正常工作。 @foo_list 的值在操作之间丢失。 我已在 before 过滤器中设置了初始值,然后我在 method1 中更改了它的值,在 method2 中它具有与 before 过滤器中定义的相同的值。 在 before 过滤器中,我设置了:     @foo_list || = [0] 然后在我的 create 操作中:     @foo_list << 1 在我的 update_list 操作中,它的值为[0]。 - Antiarchitect
1
为了在会话之间保留变量的值,应将其声明为类变量而不是实例变量(即使用@@foo_list而不是@foo_list)。 - Harish Shetty
1
终于好了。只有在 config.cache_classes = true 的情况下才能正常运行。 - Antiarchitect
显示剩余2条评论

3
我不确定我的回答是否符合您的要求,但是如果我想获取在一个控制器操作中获取的对象/模型的值,并且基于该值我需要在另一个控制器操作中获取其他值,我会使用类变量并在整个控制器操作中使用它。
例如:
@pages=Post.find.all`

@@my_value=@pages.(any manipulations)

现在@@my_values可以在该控制器的任何操作中使用。希望这有所帮助...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接