【问题标题】:Pass Parameters in render - Rails 3在渲染中传递参数 - Rails 3
【发布时间】:2012-07-02 06:39:10
【问题描述】:

我已经看到了一些关于此的问题,但一直无法解决...

我正在尝试在渲染部分时传递参数(类似于 domainname.com/memory_books/new?fbookupload=yes)

现在,我使用这条线:

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

在部分中,我尝试使用以下方法获取 fbookupload 的内容:

<%= fbookupload %>

这给出了一个“未定义的局部变量”错误和

<%= params.inspect %>

不显示 fbookupload 作为参数。

我怎样才能部分传递参数:fbookupload?

谢谢。

更新:

这与我在渲染中渲染这个事实有什么关系吗?

即具有

的页面 (/fbookphotos/show)
<%= render :partial => '/memory_books/new', :fbookupload => "yes" %>

正在由另一个页面通过 (posts/show) 呈现:

<%= render :partial => '/fbookphotos/show' %>

所以我在渲染中渲染它。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 parameters partial renderpartial


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 我觉得你的代码没问题,是不是你的部分代码有问题?
    • 其余部分加载。这可能与我在部分中的部分加载有关吗?
    • 可以将一个部分加载到另一个部分中。浏览器缓存有问题吗?
    • 知道了,指的是其他地方没有局部变量的部分,因此搞砸了渲染。谢谢!
    【解决方案2】:

    将其从 cmets 中取出以供后代使用。这个语法是正确的:

    render '/memory_books/new', fbookupload: "yes"
    

    但是如果有引用渲染相同的局部变量而不指定局部变量,例如

    render '/memory_books/new'
    

    然后fbookupload 变量变得不可用。这同样适用于多个局部变量,例如

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

    如果只出现一次就可以工作。但是如果代码中的其他地方有类似的东西

    render 'my_partial', var1: 'qq'
    

    然后var2 将变得不可用。去图...

    【讨论】:

      【解决方案3】:

      按照自己的方式去做:

      在主视图中:

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

      而在局部:

      <%= fbookupload %>
      

      第二个选项:

      最好在控制器中,否则在视图中,定义一个实例变量:@fbookupload = "yes"。然后它无处不在。然后部分将是:&lt;%= @fbookupload %&gt;

      【讨论】:

        【解决方案4】:

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

        但是如果你需要使用params[:fbookupload]', u can replace it withparams[:fbookupload] || fbookupload',并在局部哈希中传递 fbookupload。

        【讨论】:

        • 如何将它添加到渲染中的 url?当我执行 '/memory_books/new?fbookupload=yes' %> 时,我收到“缺少部分”错误
        • 不是在局部,而是在你的浏览器 url 中......但这不是一个好方法,不要在局部使用参数,使用本地变量
        • @Yuri Barbashov:你混淆了两件事:给视图的 URL 参数和给局部视图的参数。根据传入 URL 参数的值,可能会显示不同的视图和/或部分视图,但这是在控制器解析 URL 参数后确定的。我想一个 可以 使用传入的 URL 参数有条件地重定向到不同的视图,并可能在此重定向中使用 URL 参数(实际上,我什至不知道后者是否可能),但那是并不是重定向的真正用途,我觉得这不是一件好事。
        • @TeemuLeisti 我没有混淆两件事:params in partials 包含 url 参数。如果你看这个问题,你会发现他试图检查“参数”,所以我展示了他如何通过分配参数值来实现这一点,并告诉他这不是一件好事。
        • @Yuri Barbashov:对,user749798 说“类似于”带有参数的 URL。然而,渲染 部分 视图的直接 原因是因为 另一个视图 要求这样做。对于这种情况,Rails 有一个标准的参数传递方法(参见 Someth Victory 和 Anil 的答案)。在我看来,尝试使用 URL 参数来达到同样的效果似乎是一个丑陋的 hack,如果它甚至可能的话。 URL 参数是控制器方法的标准参数传递机制,然后呈现 普通 视图。但如果你不同意,那么我们只需要同意不同意。
        【解决方案5】:

        render 可以在有或没有partial 参数的情况下调用,这两种形式之间的差异似乎有些混乱。

        以下两个是等价的:

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

        和:

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

        第一个是允许您省略partial: 的速记。使用这种简写方式,局部变量也不会嵌套在locals: 下。这在the documentation 中有很好的解释(请参阅“呈现默认情况”)。

        在上述两种情况下,您可以使用my_param 直接访问部分中的my_param。

        另一个令人困惑的来源是,如果您在某处渲染部分而不传递my_param,那么部分将在尝试访问它时失败。为了解决这个问题,您可以使用local_assigns[:my_param] 而不是my_param 访问本地,如果未定义参数而不是错误,这将为您提供nil,如described in this documentation。另一种选择是在访问之前使用defined?(my_param)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          • 2012-11-07
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多