编辑:
我收到了很多解决问题的不同方法的回复,非常感谢!
可悲的是,直到现在他们都没有工作。
为了轻松理解和重现故障,我在 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/