我应该如何向rails helper方法添加自定义属性?

时间:2013-04-14 03:25:03

标签: ruby-on-rails ruby

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

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

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

self.custom_property = true

所以我可以在我看来访问它。

<%= current_user.custom_property %>

但是,Rails说“Undefined method: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,而不是配置文件中的用户。

3 个答案:

答案 0 :(得分: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,

将生成“找不到方法:ribbon_array为nil”[:user_id]

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分: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