我使用自己的自定义方法对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
)。似乎没什么用。
有什么想法吗?
答案 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