【问题标题】:Passing parameters to partial view将参数传递给局部视图
【发布时间】:2011-10-04 02:05:23
【问题描述】:

我有一个显示多个图像和这些图像的关联标签的视图。我决定为每个图像及其标签使用局部视图,但我无法将图像对象传递到局部视图中。下面是主视图的相关代码:

<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>

我在this 线程中读到,我可以按照我目前正在执行的方式传入图像对象。我尝试通过渲染方法上的选项哈希传递 id,但这也不起作用。我得到的错误是:

undefined method `model_name' for Symbol:Class

以我在主视图中调用 render :partial 的行为中心。

【问题讨论】:

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


    【解决方案1】:
    <%= render partial: "image_tag", locals: {image: i} %>
    

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

    【讨论】:

    • 我实际上已经有了它并且得到了与我目前完全相同的错误。是其他原因造成的问题吗?
    • 我的猜测是“image_tag”是一个 Rails 辅助方法,并且与您的部分名称冲突。你试过重命名你的部分吗?
    • 鉴于上下文,公平点,但我只在问题中加入“图像”以保持简单。我的实际代码名称不同,所以这不是问题。
    • 您能否确保您实际上传递了正确的项目,并确保 @items 实际上是您认为的那样?在渲染你的部分之前做一些puts 语句以确保,在你的部分中在最顶部做一些puts 语句。您也可以尝试传递整个@images 并检查吗?当我需要弄清楚变量发生了什么时,这就是我所做的。随时通知我们! :)
    • 好吧,我想通了。问题是我将局部视图名称作为符号而不是字符串。一旦我将 'render :partial => :image_tag' 更改为 'render :partial => "image_tag"',一切都解决了。不知道为什么符号表示不起作用,但感谢您的帮助!
    【解决方案2】:

    您也可以像这样将整个对象传递给部分对象:

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

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

    编辑:查看 rails 指南看起来像在 rails 3 中的 :object 现在作为实例变量而不是本地变量访问,因此 @image 将是您在部分中使用的。

    【讨论】:

    • 我认为您的EDIT: 不正确。 Quoting: 在以前的 Rails 版本中,默认的局部变量会在父级中查找与局部变量同名的实例变量。此行为在 2.3 中已弃用,并已在 Rails 3.0 中删除。在您的回答中,作为 :object 传递的对象的值将在部分内部作为名为 partialpath 的局部变量(不是 @987654326 @、@image 或 image)
    【解决方案3】:

    对于那些可能无法将值发送到部分的人来说,需要考虑的其他事项。 如果您在部分路径之前省略“部分:”,如下所示...:

    <%= 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:' 组件。

    【讨论】:

    • 你救了我。谢谢!
    • pithier rails 4 语法&lt;%= render partial: 'my_partial', locals: {greeting: 'Hello world', x: 36} %&gt;
    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2015-09-15
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多