使用装饰器的上下文输出

时间:2014-04-16 23:46:22

标签: ruby-on-rails

我想提供上下文输出,我原本认为装饰器是放置这个逻辑的地方。但是,我无法在装饰器中访问我的current_user方法。

现在,我在视图中这样做:

<% if current_user == @user %> Your <% else "#{@user.username}'s" end %> profile

看起来有点乱。我想在一个布料中做到这一点。这是我实现这一目标的第一步:

class UserDecorator < ApplicationDecorator
  delegate_all

  include SessionsHelper        

  def is_owner?
    current_user === model
  end

end

我的会话助手:

module SessionsHelper

    def current_user=(user)
        @current_user = user
    end

    def current_user
        remember_token = User.hash(cookies[:remember_token])
        @current_user ||= User.find_by(remember_token: remember_token)
    end
end

然而,这导致:

undefined local variable or method `cookies' for #<UserDecorator:0x000000054ad2d8>

app/helpers/sessions_helper.rb:9:in `current_user'
app/decorators/user_decorator.rb:9:in `is_owner?'
app/views/users/show.html.erb:37:in `_app_views_users_show_html_erb___2600317495065048162_44417960'

我可以包含包含cookies方法的模块(顺便说一句,这是哪个部分?)但是如果我需要的话,我无法帮助我做错包括所有这些东西?

我也想在一个布料中做到这一点:

<% if current_user == @user || current_user.is_admin? %> 
   <!-- buttons leading to private functionality -->
<% end %>

但不知道如何输出复杂的多行html,如按钮集合。 我应该创建html的这个秘密部分的一部分并从装饰器渲染部分吗?

2 个答案:

答案 0 :(得分:2)

如果您正在使用Draper gem并希望在装饰器中使用辅助方法,那么您应该使用h.来调用它们。因此,在您的情况下,它将是h.current_user

答案 1 :(得分:1)

我认为你在current_user中使用UserDecorator助手的方式就是问题所在。根据{{​​3}},为了访问Draper decorator类中的帮助器,您可以使用h方法。

<强> e.g。

def is_owner?
  h.current_user
end

如果您不希望始终使用h方法,则只需添加Draper::LazyHelpers即可。这样,你现在的代码就可以了。

class UserDecorator < ApplicationDecorator
  delegate_all
  include Draper::LazyHelpers # Add this line

  include SessionsHelper        

  def is_owner?
    current_user === model
  end

end