2

我有一个 Rails 辅助方法...

  def current_user
    @user = User.find(cookies[:user_id]) if cookies[:user_id]
  end

我想向它添加一个非数据库属性......

self.custom_property = true

所以我可以在我的视图中访问它。

<%= current_user.custom_property %>

但是,Rails 说“未定义的方法:custom_property”

这是完整的代码:

  def current_user
    @user = User.find(cookies[:user_id]) if cookies[:user_id]

    @user.ribbon_array ||= []
    self.is_moderator = @user.ribbon_array.include?(1) ? true : false
  end

我想这样做,所以在我看来,我可以检查 current_user.is_moderator。在我的代码的其他地方,我有一个特定于每个页面的 @is_moderator 变量,但是这个变量将在整个应用程序中使用,并且特定于 current_user 而不是配置文件上的用户。

4

3 回答 3

1

要做到这一点

我想这样做,所以在我看来,我可以检查 current_user.is_moderator。在我的代码的其他地方,我有一个特定于每个页面的 @is_moderator 变量,但是这个变量将在整个应用程序中使用,并且特定于 current_user 而不是配置文件上的用户。

我建议你在你的用户模型上实现一个名为的方法

def is_moderator_of(page)
    # returns true or false here
end

或者更好的是,使用像cancan这样的授权 gem

编辑:

还有,这

@user = User.find(cookies[:user_id]) if cookies[:user_id]
@user.ribbon_array ||= []

如果没有 cookie[:user_id],将生成“Method not found:ribbon_array for nil”

于 2013-04-14T04:22:27.017 回答
0

在您的 app/models/user.rb 文件中:

class User << ActiveRecord::Base
  attr_accessor :custom_property
  ...
end

然后您的视图代码应该可以工作。

或者,您可以在帮助程序中设置@custom_property = true,并在视图中使用@custom_property。

于 2013-04-14T03:33:06.310 回答
0

编辑

我的坏没有太多的想法。在这种情况下,可能更好的解决方案是添加另一个辅助方法。助手本身并不是那么面向对象,因此您也应该能够容忍这种解决方案。

def current_user
  @current_user = User.find(cookies[:user_id]) if cookies[:user_id]
end

def is_moderator?
   ribbon = @current_user.ribbon_array || []
   ribbon.include?(1)
end 
于 2013-04-14T04:19:41.933 回答