Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 访问主应用程序';s CanCan规则来自Rails 3.1引擎_Ruby On Rails_Ruby_Ruby On Rails 3_Cancan - Fatal编程技术网

Ruby on rails 访问主应用程序';s CanCan规则来自Rails 3.1引擎

Ruby on rails 访问主应用程序';s CanCan规则来自Rails 3.1引擎,ruby-on-rails,ruby,ruby-on-rails-3,cancan,Ruby On Rails,Ruby,Ruby On Rails 3,Cancan,我正在尝试使用一个gem,它恰好利用了CanCan授权框架以及我的主要应用程序。主应用程序和Rails引擎都有自己的功能.rb文件 当我尝试执行一些授权检查时,布局中出现了问题: <% if can? :update, User %> <%= link_to_current_user :content_method => :login %>. <% else %> :登录%>。 当我使用引擎上的布局文件时,它会参考其

我正在尝试使用一个gem,它恰好利用了CanCan授权框架以及我的主要应用程序。主应用程序和Rails引擎都有自己的功能.rb文件

当我尝试执行一些授权检查时,布局中出现了问题:

    <% if can? :update, User %>
        <%= link_to_current_user :content_method => :login %>.
    <% else %>

:登录%>。
当我使用引擎上的布局文件时,它会参考其自身的ability.rb文件进行授权。当然,我的主应用程序中没有规则,所以授权在不应该的时候失败。我有没有办法强迫它去“主要”的坎坎


谢谢。

到目前为止,我找到的唯一方法是将两个文件合并成一个单独的文件,在启动时将其分离为模块和monkey patch这两种功能。不太好。

我还是ruby的初学者,但我希望能在以下方面帮助你

更新

另一个要尝试的问题,如上所述,是选择为您的模型加载哪个能力文件

创建您自己的模型:

# in models/admin_ability.rb

class AdminAbility
  include CanCan::Ability

  def initialize(user)
    # define admin abilities here ....
  end
end
然后,将其用于您的模型

def current_ability
   @current_ability ||= AdminAbility.new(current_user)
end
我希望这个解决方案能解决你的问题


Steph

我认为最简单的解决方案是使用monkey patch forem的定义添加您自己的声明:

class Forem::Ability
  alias_method :orig_init, :initialize
  def initialize(user)
    orig_init(user)

    # Put your own authorization code here.
  end
end

class Ability < Forem::Ability; end
而您的(cancan gem中的默认值)的内容如下:

def current_ability
  @current_ability ||= Forem::Ability.new(current_user)
end
def current_ability
  @current_ability ||= Ability.new(current_user)
end

因此,我上面的解决方案应该可以解决您的问题,但这可能是它存在的特定问题。

您确定要
can吗?:更新,用户
可能是
can?:更新,当前用户
?怀疑你和引擎的能力.rb实际上是一团糟。这不会改变任何事情。可以吗更新,用户是有效的用法。