ruby-on-rails - Rails Presenter block 方法

标签 ruby-on-rails ruby slim-lang

编辑:

我收到了很多解决问题的不同方法的回复,非常感谢!

可悲的是,直到现在他们都没有工作。

为了轻松理解和重现故障,我在 GitHub 上创建了一个小型 Rails 存储库 带有 Rspec 套件。

其中一项规范正在通过(演示者在 View 中初始化)。 其中一项规范失败(演示者在 Controller 中初始化)。

如何让他们都通过?

下面是原始问题:

这是我的演示者:

class UserPresenter
  def initialize(user, vc)
    @user = user
    @vc   = vc
  end

  def linkify()
    #
    # HERE IS THE PROBLEM
    #
    vc.link_to("foo") do
      yield
    end
  end
end

这是我的 Controller :

我在 Controller 中初始化我的 Presenter,将 Controller 的 View 上下文与呈现的模型一起传递。

class UserController
  def show
    @user = User.find(#.....
    @presenter = UserPresenter.new(@user, view_context)
  end
end

在我的 Slim 模板中,我调用 Presenter 将内容放入链接中:

=@presenter.linkify do
  p "123"

我的问题是,我无法将 block 从 View 传递到我的 linkify 方法。

在上面代码的with注释中,传递的 block 是整个 View 内容,而不是p 123

当我通过以下方式在 View 中初始化 Presenter 时:@presenter = UserPresenter.new(@user, self),它按预期工作。

如何使 linkify 方法使用提供的 block ,而无需在 View 中初始化演示者?

最佳答案

因为如果您要使用 yield 命令,则不能指定 &block,因为现在您可以使用普通参数语法有效地接收 block 作为参数。

class UserPresenter
  def initialize(user, vc)
    @user = user
    @vc   = vc
  end

  def linkify() # <-- Remove &block
    vc.link_to("foo") do
      yield
    end
  end
end

# ...
# Somewhere else, assuming you have access to @presenter which is an instance of
# UserPresenter
# ...

def show
  @presenter.linkify do
    # ...
    # do my view stuff here
    # ...
  end
end

show()

# Now, if your "View" is nothing but a block that needs to get passed in
# then you'd do this...

def show(&block)
  @presenter.linkify do
    block.call()
  end
end

# This would be used this way:

show(lambda {  
  # ...
  # View stuff here
  # ..
}) 

关于ruby-on-rails - Rails Presenter block 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21401958/

相关文章:

css - rails 4.1 中的背景图像渲染问题

mysql - Rails 5 : How to order models by associated model attribute, 并使它们不同

ruby - ruby 中的父/子关系?

ruby-on-rails - 如何设置 Rails Slim HTML 电子邮件模板的最大行长度?

ruby - 如何在ruby中直接使用Slim

ruby-on-rails - heroku:Gemfile.lock 是必需的问题

ruby-on-rails - 尝试使用 fastercsv gem 时出现 "no such file to load -- fastercsv"错误

ruby-on-rails - audited,查找属于用户的审计

ruby-on-rails - rails : The action 'index' could not be found for ContactsController

ruby-on-rails - Ruby on Rails 上的 Slim 模板,最佳实践是什么