在帮手中Rails部分本地人

时间:2014-12-12 10:16:51

标签: ruby-on-rails ruby

RoR中是否有办法访问助手中的当前部分本地人。我想要像

这样的东西
<% render partial: 'foo', locals: { :foo: 'bar' } %>

然后进入,让我们说ApplicationHelper:

def my_helper_method
  ...
  my_var = ...local_assigns[:foo] # should assign 'bar'
  ...
end

描述问题的其他方法是:如何隐式地将传递给部分的局部传递给我的助手方法?如果我明确地这样做,有很多样板代码,它只是将部分参数传递给一个辅助方法,而且我有很多这样的代码。

有可能吗?

3 个答案:

答案 0 :(得分:1)

助手不了解局部变量中的局部变量。除非您明确地向他们传递参数,否则您无法按照您的建议行事。你可以做的是使用presenters采用面向对象的方法,并避免一起使用帮助器。

如Railscasts剧集中所述,制作您自己的,或使用像Draper这样的宝石。就个人而言,我赞成你自己的#34;接近因为它非常简单。

一些伪代码可以解决这个问题:

class FooPresenter
  def initialize(object, template)
    @object, @template = object, template
  end

  def amazing_foo
    @template.content_tag :div, class: 'foo' do
      "#{@object.name}: Wow! this is incredible!"
    end
  end
end

module FooHelper
  def present_foo(object)
    presenter = FooPresenter.new(object, self)
    yield presenter if block_given?
    presenter
  end
end

只是从你的视图中实例化。

= present_foo(foo) do
  = amazing_foo

是的,不需要通过params。

帮助程序只是在命名空间中浮动的模块,坦率地说,它们大多数时候都会鼓励错误的编码实践。演示者提供了一种清晰的OOP方式来处理复杂的视图逻辑。试一试。

答案 1 :(得分:0)

通常您会将参数从视图传递到方法中,因此请将方法更改为:

def my_helper_method(input_param)
  ...
  my_var = ...foo # should assign 'bar'
  ...
end 

并将其称为视图中传递foo的任何其他方法作为input_param。

答案 2 :(得分:0)

您需要将参数发送到my_helper_method

def my_helper_method(foo)
  ...
  my_var = foo
  ...
end

部分

<%= my_helper_method(foo) %>