gpt4 book ai didi

ruby-on-rails - Rails Presenter block 方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:24:47 24 4
gpt4 key购买 nike

编辑:

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

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

为了轻松理解和重现故障,我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com