在液滴导轨5

时间:2018-07-12 13:04:03

标签: ruby-on-rails session devise liquid

我目前正在应用程序中实现液体模板。作为其一部分,我创建了一组液滴(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

我没有访问该会话的运气。有人有任何建议或想法吗?还是我会完全以错误的方式来解决这个问题?

1 个答案:

答案 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

显然,这需要错误处理等。但希望能对某人有所帮助。另外,如果有人知道更好的方法,也很想听听。