加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails Presenter块方法

发布时间:2020-12-17 03:48:43 所属栏目:百科 来源:网络整理
导读:编辑: 我有很多回答用不同的方法解决问题,非常感谢! 可悲的是,直到现在他们都没有工作. 为了便于理解和重现故障,我在GitHub上使用Rspec套件创建了一个小型Rails repo. 其中一个规格是传递(在视图中初始化演示者). 其中一个规格是失败的(主持人在控制器中初
编辑:

我有很多回答用不同的方法解决问题,非常感谢!

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

为了便于理解和重现故障,我在GitHub上使用Rspec套件创建了一个小型Rails repo.

其中一个规格是传递(在视图中初始化演示者).
其中一个规格是失败的(主持人在控制器中初始化).

怎么让他们都通过?

下面的原始问题:

这是我的演示者:

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

这是我的控制器:

我在控制器中初始化我的Presenter,使用提供的模型传递控制器的视图上下文.

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

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

=@presenter.linkify do
  p "123"

我的问题是,我无法将视图中的块传递给我的linkify方法.

在上面标记的带注释的情况下,传递的块是整个视图内容,而不是p 123.

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

如何使linkify方法使用提供的块,而不在视图中初始化演示者?

解决方法

因为如果要使用yield命令,则不能指定&块,因为现在您使用常规参数语法有效地接收块作为参数.

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
  # ..
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读