1

我来自 PHP 和 CakePHP 背景,我对 ruby​​ 和 rails 很陌生。

我一直在创建一个帮助器,它可以帮助我创建一些 HTML 元素,这些元素可以让我轻松地在我正在创建的 Web 应用程序中重用。

这是我的助手片段的样子

module VehicleHelper
  def mileage(vehicle)
    render partial: "vehicles/shared/mileage", { locals: vehicle }
  end
  def manufacturer(vehicle)
    render partial: "vehicles/shared/manufacturer", { locals: vehicle }
  end

  #and etc...
end

我会在haml中以这种方式使用它。

%h1= @vehicle.name


= mileage @vehicle
= manufacturer @vehicle
-# and etc…

我希望能够确定它的范围,这样我就不需要@vehicle为每个函数提供一个参数。喜欢

%h1= @vehicle.name


- vehicle_block_for @vehicle do
  = mileage
  = manufacturer
  -# and etc…

我如何实现它?这是我应该使用的正确模式吗?

编辑:我曾想过在视图中直接使用局部。然而,问题是我不仅有Vehicle类,我还有CarBike,它们是 的子类Vehicle,遵循 STI 模式。

这意味着我将不得不一直传递本地人,在这种情况下= render partial: 'mileage', { locals: vehicle}或不成为配置代码。假设我已重命名文件或将其移动到某个地方,那么我必须去修改所有这些代码。

4

3 回答 3

1

关于这是否是您使用的“正确模式”,这完全取决于您。如果您喜欢它读取代码的方式,那就太好了。最简单的实现是这样的:

 module VehicleHelper
   def vehicle_block(vehicle)
     old,@__vehicle__ = @__vehicle__,vehicle
     yield
     @__vehicle__ = old
   end

   def mileage
     render partial: "vehicles/shared/mileage", { locals: @__vehicle__ }
   end
 end
于 2013-06-15T14:14:31.957 回答
1

您可以直接在您的视图中进行渲染调用,它会自动访问您的实例变量“@vehicle”......我相信这些视图可以访问“@vehicle”,因为我们将使用您当前的帮助方法有,无需将其作为参数传递。

我还将为此检查演示者/装饰者模式。它有一个 Railscast。

于 2013-06-15T14:17:11.713 回答
0

这是我应该使用的正确模式吗?

我会说不。是的,您正在缩短代码,但代价是使事情更难理解/理解。您项目的新用户将不得不四处搜索“里程”方法的定义。一旦他们在助手中找到它,他们将不得不去查看部分。所有这些都是为了什么,在视图中显示更少的代码?我不认为这是值得的。

我会将其恢复为以下内容,恕我直言,更容易遵循和更惯用的轨道。

%h1= @vehicle.name

  render partial: 'mileage', { locals: vehicle }
  render partial: 'manufacturer', { locals: vehicle }

注意:我也会明确地传入locals而不是使用@vehicle. 它使事情变得更加明确。

于 2013-06-15T16:16:28.763 回答