将参数传递到局部视图


69

我有一个视图,可以显示多个图像以及这些图像的关联标签。我决定为每个图像及其标签使用局部视图,但是在将图像对象传递到局部视图时遇到了麻烦。这是主视图的相关代码:

<table>
  <% @images.each do |i| %>
    <tr>
      <%= render :partial => :image_tag, :image => i %>
    </tr>
  <% end %>
</table>

这是部分视图的相关代码(部分视图名为_image_tag.html.erb):

<table>
  <%= image.id %>
  <%= image_tag image.src %>
</table>

我在这个线程中读到,我可以像现在那样传递图像对象。我尝试通过render方法上的选项哈希传递id,但这也没有用。我得到的错误是:

undefined method `model_name' for Symbol:Class

围绕我在主视图中调用render:partial的线居中。

Answers:


103
<%= render partial: "image_tag", locals: {image: i} %>

是将变量传递给局部变量的方式。


我实际上已经拥有了,并且得到了与我当前完全相同的错误。还有其他导致问题的原因吗?
jnevelson 2011年

我的猜测是“ image_tag”是Rails的辅助方法,并且与您的部分名称冲突。您是否尝试过重命名部分内容?
salt.racer 2011年

给定上下文的公平点,但我仅在问题中添加“图像”以使其简单。我的实际代码命名不同,所以这不是问题。
jnevelson 2011年

您是否可以确保传递的实际上是正确的项目,并确保@items实际上就是您认为的样子?puts在呈现部分内容之前请先做一些陈述,以确保puts局部内容的最顶部。您还可以尝试传递“整个”@images并进行检查吗?这是我需要弄清楚变量正在发生什么时要做的事情。让我们发布!:)
vinceh 2011年

好吧,我知道了。问题是我将局部视图的名称作为符号而不是字符串。一旦我将'render:partial =>:image_tag'更改为'render:partial =>“ image_tag”',一切就解决了。不知道为什么符号表示不起作用,但是感谢您的帮助!
jnevelson 2011年

69

对于可能无法将价值发送给部分商品的那些商品,还需要考虑其他事项。如果您在局部路径之前省略了'partial:',就像这样...:

<%= render 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %>

...看来您将无法直接访问本地哈希值。相反,您需要执行以下操作:

<div>
  <h1> <%= locals[:greeting] %> , my x value is <%= locals[:x] %> </h1>
</div>

但是,在您的部分路径之前包括“ partial:”,如下所示:

<%= render partial: 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %>

...使您可以直接访问哈希值,如下所示:

<div>
  <h1> <%= greeting %> , my x value is <%= x %> </h1>
</div>

只是要考虑的一件事,在尝试访问本地哈希值时,我被这个问题困扰,并意识到我已经省略了“ partial:”组件。


你救了我。谢谢!
hbobenicio

1
pithier rails 4语法 <%= render partial: 'my_partial', locals: {greeting: 'Hello world', x: 36} %>
Jerome

11

您还可以将整个对象传递给部分对象,如下所示:

<%= render :partial => "partialpath", :object => :image %>

在您的情况下,您可以将i替换为image,并将局部路径替换为局部路径。在局部中,它可以访问与局部名称同名的局部变量。因此,如果您的局部名称为“ image”,则本地变量image将成为您传入的对象。

编辑:看着rails导轨看起来像在rails 3中::object现在作为实例变量而不是局部变量进行访问,因此@image将是您在局部视图中使用的对象。


2
我不认为你EDIT:是正确的。引用早期版本的Rails中,默认局部变量将查找与父变量中的局部变量同名的实例变量。此行为已在2.3中弃用,并已在Rails 3.0中删除。在你的答案,因为传递的对象的价值:object将是局部的内部接近作为命名的局部变量partialpath(不是@partialpath@imageimage
Zabba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.