如何将实例变量传递给rails中的另一个视图

时间:2011-03-04 17:03:10

标签: ruby-on-rails

嘿。我想我在这里陷入困境。 我正在使用Rails 2。在我的控制器的索引视图中,我设置了类似

的内容
def index
  @posts = Post.all
end

这样我就可以在我的索引中使用@posts,例如每个-DO。我想将@posts传递给自定义视图,在那里我可以再次使用相同的变量。我想通过索引视图进行链接。这样的事情:

link_to "newpage", {:controller => 'posts', :action => 'newmethod', :param => @posts}

到目前为止,我创建的是Post控制器中的一种新方法。一种新观点。以及通往该网站的新路线。有什么建议? thx你的时间

3 个答案:

答案 0 :(得分:1)

在您的控制器中

def newmethod
   @posts = Post.all
end

您无法在链接中传递所有模型!索引操作中的@posts var在请求

后消失

答案 1 :(得分:1)

您将不得不将这些值折叠为适合URL的内容,然后再对其进行解码。例如:

# Put this in your helper method module PostsHelper
def post_ids
  @posts.collect(&:id).join(',')
end

您调整后的链接将是:

link_to "newpage", {:controller => 'posts', :action => 'newmethod', :param => post_ids }

当您获取下一页时,您需要通过再次检索它们来解码它们:

@posts = Posts.find(params[:param].split(/,/))

无法在请求之间传递实例变量,因为它们已被明确清除。

作为注释,请尝试使用生成的路由方法而不是哈希样式声明。您可能已在rake routes中列出了一条路线:

# Instead of { :controller => 'posts', :action => 'new', :param => post_ids }
new_post_path(:param => post_ids)

这些生成的方法在实践中更具可读性,如果您想通过调整路由表来重新解释它们的含义,那么它具有以后可配置的优势。

另一个注意事项是,如果ID列表变得非常大,您可能无法将它们编码为URL,因为限制大约为1500字节。您可能必须首先序列化用于生成列表的条件,然后再重新运行它们。只要你处理数十件而不是数百件,你应该没事。

答案 2 :(得分:1)

我知道在会话中存储任意数据不是最佳做法,但在某些情况下,这种方法简单易行。

在您的控制器中:

def balabala
  #...
  session[:your_var] = "this is the var used in another view&action!"
  # ...
end

在任何其他页面中:

<%=  session[:your_var] %>

就是这样。丑陋,根本不是MVC。 :)仅适用于非常罕见的情况。 :)