在Rails 3中如何在渲染视图时传递参数

15

我看到了一些相关的问题,但是还没有能够解决...

我在尝试渲染一个局部视图时传递参数(类似于domainname.com/memory_books/new?fbookupload=yes)

目前,我使用了这一行代码:

<%= render :partial => '/memory_books/new', :fbookupload => "yes" %>

在Partial中,我尝试通过以下方式获取fbookupload的内容:

<%= fbookupload %>

这将导致"undefined local variable"错误。

<%= params.inspect %>

没有显示fbookupload作为参数。

我该如何使部分传递参数:fbookupload?

谢谢。

更新:

这与我在渲染中呈现有关吗?

即。具有的页面(/fbookphotos/show)

<%= render :partial => '/memory_books/new', :fbookupload => "yes" %>

正在通过另一个页面(posts/show)进行渲染:
<%= render :partial => '/fbookphotos/show' %>

所以我正在一个渲染中呈现这个内容。
5个回答

20

试试这个:

<%= render :partial => '/memory_books/new', :locals => {:fbookupload => "yes"} %>

我认为你的代码没问题,是你的部分有什么问题吗? - Someth Victory
1
剩下的部分加载。这可能与我在局部内进行的部分加载有关吗? - user749798
在一个 partial 中加载另一个 partial 是可以的。这与浏览器缓存有关吗? - Someth Victory
3
明白了,我指的是在没有使用本地变量的情况下参考其他部分,因此破坏了渲染。谢谢! - user749798

18
将其从评论中取出以备后用。以下语法是正确的:
render '/memory_books/new', fbookupload: "yes"

但是,如果有一个对于渲染相同部分的引用,而不指定本地变量,例如:

render '/memory_books/new'

那么fbookupload变量就会变得不可用。对于多个本地变量也是同样的情况,例如:

render 'my_partial', var1: 'qq', var2: 'qqq'

只有出现一次才能正常工作。但如果代码中其他地方也存在这样的情况,可能会导致问题。
render 'my_partial', var1: 'qq'

那么var2将变得不可用。自己琢磨吧...


1

render可以带有或不带有partial参数,这两种形式之间似乎存在一些混淆。

以下两种形式是等价的:

<%= render "my_partial', my_param: true %>

并且:

<%= render partial: "my_partial', locals: { my_param: true } %>

第一种方法是一个简写,允许您省略partial:。使用这个简写,本地变量也不会嵌套在locals:下面。这在文档中(见“呈现默认情况”)有很好的解释。
在上述两种情况中,您可以直接使用my_param在局部中访问my_param
另一个令人困惑的来源是,如果您在没有传递my_param的情况下呈现局部,则当它尝试访问它时,局部将失败。为了避免这种情况,您可以使用local_assigns[:my_param]来访问局部,而不是my_param,这将在未定义参数时给您nil,而不是出错,如文档所述。另一种选择是在访问之前使用defined?(my_param)

1

按照您的方式进行操作:

在主视图中:

<% fbookupload = "yes" %>
<%= render :partial => '/memory_books/new', :locals => {:fbookupload => fbookupload} %>

而在局部:

<%= fbookupload %>

第二个选项:
理想情况下,在控制器中或视图中定义一个实例变量:@fbookupload = "yes"。这样它就可以在任何地方使用了。部分内容将会是:<%= @fbookupload %>

1

Params只是请求参数,所以如果您想在params中传递它,您必须将其添加到您的URL中?fbookupload=yes或者分配它params[:fbookupload] = "yes",但我认为这不是一个好主意。

但是如果您需要使用params[:fbookupload],您可以用params[:fbookupload] || fbookupload替换它,并在局部哈希中传递fbookupload。


我该如何在渲染中将它添加到URL?当我执行<%= render :partial => '/memory_books/new?fbookupload=yes' %>时,我会收到“Missing partial”错误。 - user749798
不要在partial中使用params,这样做并不好,应该使用本地变量。 - Yuri Barbashov
@Yuri Barbashov:您混淆了两件事情:给视图的URL参数和给部分的参数。根据传入的URL参数值,可能会显示不同的视图和/或部分,但是这是在控制器解析URL参数之后确定的。我想一个人可以使用传入的URL参数有条件地重定向到不同的视图,并可能在此重定向中使用URL参数(实际上,我甚至不知道后者是否可能),但这并不是重定向的真正目的,并且让人感觉不好。 - Teemu Leisti
@TeemuLeisti 我并没有混淆两件事情:partials 中的 params 包含 URL 参数。如果您查看问题,您会发现他试图检查 params,所以我展示了他如何通过分配 params 值来实现这一点,并告诉他这不是一个好的做法。 - Yuri Barbashov
@Yuri Barbashov:没错,user749798说的是带参数的URL类似于。然而,呈现部分视图直接原因是因为另一个视图要求这样做。对于这种情况,Rails有一种标准的参数传递方法(请参见Someth Victory和Anil的答案)。如果试图使用URL参数来实现相同的功能,那么在我看来,这是一种丑陋的hack,即使可能性存在。URL参数是控制器方法的标准参数传递机制,然后呈现普通视图。但是,如果您不同意,那么我们只能同意不同意。 - Teemu Leisti
@Yuri Barbashov:但好吧,你说你认为这不是一件好事,我起初没有注意到。我试图撤销对你回答的负面投票,但除非编辑答案,否则无法实现。 - Teemu Leisti

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