我目前正在应用程序中实现液体模板。作为其一部分,我创建了一组液滴(https://github.com/Shopify/liquid/wiki/Trying-to-Understand-Drops)类,以充当模型和模板之间的中介。我目前正在使用devise在Rails 5上进行身份验证。
在我的产品放置类中,我希望能够检查当前用户是否拥有该产品:
class ProductDrop < Liquid::Drop
def initialize(model)
@model = model
end
def owned_by_user?
#somehow access the current_user provided by devise.
end
end
但是还无法弄清楚如何访问用户。
我在shopify上通过这种方法注意到:https://help.shopify.com/en/themes/liquid/objects/variant#variant-selected 如果选择了变体,他们将能够访问当前URL进行计算。我认为,如果他们可以访问url,访问会话并获取用户标识符来查找用户,则可能是可行的。
所以我可以做类似的事情:
def owned_by_user?
User.find_by_id(session[:user_id]).owns_product?(@model.id)
end
我没有访问该会话的运气。有人有任何建议或想法吗?还是我会完全以错误的方式来解决这个问题?
答案 0 :(得分:0)
因此,在深入研究液滴源代码之后。我注意到该上下文可通过放置(https://github.com/Shopify/liquid/blob/master/lib/liquid/drop.rb)访问。我第一次看时完全想念它。
所以解决方案最终是:
首先添加用户,以供呈现视图的控制器操作使用。然后通过液体模板处理程序将其添加到上下文中(因此存在于上下文中)
class ApplicationController < ActionController::Base
before_action :set_common_variables
def set_common_variables
@user = current_user # Or how ever you access your currently logged in user
end
end
将方法添加到产品中以从流动的上下文中吸引用户
class ProductDrop < Liquid::Drop
def initialize(model)
@model = model
end
def name
@model.name
end
def user_owned?
return @context['user'].does_user_own_product?(@model.id)
end
end
然后将方法添加到用户以检查用户是否拥有该产品:
class UserDrop < Liquid::Drop
def initialize(model)
@model = model
end
def nick_name
@model.nick_name
end
def does_user_own_product?(id)
@model.products.exists?(id: id)
end
end
显然,这需要错误处理等。但希望能对某人有所帮助。另外,如果有人知道更好的方法,也很想听听。