别名查找方法会出现UnauthorizedAccess错误

时间:2014-06-19 17:29:17

标签: ruby-on-rails ruby ruby-on-rails-4 activeresource

我使用自己的自定义方法对ActiveResource的find方法进行别名,以便在返回数据之前添加一些属性。

class User < ActiveResource::Base  
  class << self
    alias_method :find_original, :find

    def find(username='Guest')
      @user_info = find_original(username)
    end
  end
end

以上代码在100%的时间内都能正常运行。当我尝试在find方法中创建User的新实例时,会出现此问题。

class User < ActiveResource::Base  
  class << self
    alias_method :find_original, :find

    def find(username='Guest')
      @user_info = find_original(username)
      @user = new(username: username, user_settings: {})
    end
  end
end

编辑:

此代码仅适用于我发送的第一个用户名:

User.find('user1')
=> #<User:0x007fab51df5990 @attributes={"username"=>"user1", "user_settings"=>#     <User::UserSettings:0x007fab51dfe2e8 @attributes={}, @persisted=false, @prefix_options={}>}, @persisted=false, @prefix_options={}>

如果我在同一个会话期间尝试使用任何其他用户名,我会收到此错误:

 User.find('user2')
ActiveResource::UnauthorizedAccess: Failed.  Response code = 401.  Response message = [ISS.0084.9001] Invalid credentials. app/models/user.rb:21:in `find'

我尝试使用super(而不是alias_method),并将我的find方法命名为不会产生任何冲突的东西(如def find_blah)。似乎没什么用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如我的评论中所述,我不确定你要做什么。但是,也许你正试图这样做:

User.where(username: username).first_or_initialize

或者将其包装在方法中:

class User
  def self.custom_find(username='Guest')
    where(username: username).first_or_initialize
    # or where(id: username).first_or_initialize
  end
end