【问题标题】:Unhappy with the rail way of rendering partials对渲染局部的铁路方式不满意
【发布时间】:2013-12-10 22:04:03
【问题描述】:

我的问题考虑了 Rails 中的部分处理。我只是无法理解某些设计决策的原因。

如果我像这样渲染一个局部:

<%= render partial: 'foo/bar', object: @herbie %>

@herbie 是 Car 类的对象。为什么默认情况下局部变量称为bar 而不是car,至少对我而言,在大多数情况下会更合理。

如果各种部分共享一个共同的布局,我必须在每次使用render partial: 时添加layout: ...。这对我来说似乎很奇怪!是不是更有可能有各种部分共享相同的布局而不是相反?在部分中定义布局,或者在 ActiveRecord 模型中添加to_layout_path 方法不是更合理吗?

更新:

我明白使用部分名称可能会更好,因为这在部分上下文中是众所周知的。然而,使用标签 :locals 和 :as 搞砸了这个论点。

在实际情况下,我想根据对象的状态(可能是打开或关闭的问题)使用不同的部分。我将部分渲染的决定移到了Question.to_partial_path 方法,这似乎很优雅。但是我将部分命名为open_questionclosed_question,这使得部分代码不可读。 如果我考虑不同类型的问题,情况会变得更糟。

我希望在部分中我们总是对传入的模型做出一些假设。因此在closed_question 我确定我得到了一个问题 - 因此我希望变量被称为问题。另一方面,我可以想象我们传递一些不同的东西的情况,这些东西只是表现得恰到好处(Duck-typing)。

我关于部分的时间含义是,在部分中应该可以定义给定参数的名称以及使用的布局文件。 该参数确实可以通过引入一个对我来说有点不干净的新变量(question = open_question)来实现。

【问题讨论】:

    标签: ruby ruby-on-rails-3.2 ruby-on-rails-4 renderpartial


    【解决方案1】:

    当您将参数传递给方法时,无法知道该变量的“名称”是什么。这里的部分渲染方法唯一可以使用的是foo/bar 名称、object 属性和一些模型。

    您的模型源自名为@car 的变量在调用过程中完全丢失。

    Rails 中的约定是,在分部中使用的变量与分部本身的名称相同。如果你想有非标准的行为,你可以覆盖它:

    render(partial: 'foo/bar', locals: { car: @car })
    

    不过,请注意,走非标准路径通常是个坏主意。只要有可能,只需重命名您的部分以更好地满足您的期望。

    【讨论】:

    • 感谢您的第一次请求。这让我重新思考。我编辑我的问题。您使用:locals 的“解决方案”也最终导致不知道局部变量的名称。也许对于任何部分变量应该只是object
    • locals 哈希的键用于建立本地人的名称。你必须重复一遍,就像我在这里使用 car: @carfoo: @foo 一样。
    • 对不起,如果我的英语无法理解;-) 我提到了一个事实,即局部变量不是在局部变量中而是在渲染调用期间声明的,因此在编写局部变量时是“未知的”。
    • 每个部分都必须根据它的调用方式来构造,所以在这里你需要格外小心。您需要设计您的部分,然后正确调用它,否则会出现未定义变量的错误。
    【解决方案2】:

    这是相关的:render partial :object vs :locals

    文档还不错:http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html

    默认是在部分后命名对象。如果你想明确一点,你可以使用 :as 或 locals。

    render partial: 'foo/bar', locals: {car: @car}
    render partial: 'foo/bar', object: @car, as: 'car'
    

    【讨论】:

    • 我不是在寻求解决方案,而是试图了解 Rails 设计决策背后的逻辑。我知道这些参数,并且我已经阅读了上面的链接。但是我不明白为什么会这样!
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多