我想提供上下文输出,我原本认为装饰器是放置这个逻辑的地方。但是,我无法在装饰器中访问我的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的这个秘密部分的一部分并从装饰器渲染部分吗?
答案 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