【问题标题】:How should I add a custom property to a rails helper method?我应该如何将自定义属性添加到 rails 辅助方法?
【发布时间】:2026-02-12 21:00:01
【问题描述】:

我有一个 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 而不是配置文件上的用户。

【问题讨论】:

  • @Joshua Scott 的回答是最好的。但是,如果您想分享您为什么要这样做,也许我们可以帮助您找出更好的方法?
  • @fotanus 当然,我会编辑帖子。

标签: ruby-on-rails ruby


【解决方案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 ||= []

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

【讨论】:

    【解决方案2】:

    编辑

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

    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 
    

    【讨论】:

    • 这似乎可行,但为 ApplicationController:Class 返回了undefined local variable or method current_user'。
    【解决方案3】:

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

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

    那么您的视图代码应该可以工作。

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

    【讨论】:

    • 它仍然给我undefined method 'is_moderator=' for #&lt;ChallengesController:0x007f9373170aa8&gt;
    • 因为你在控制器中运行self.is_moderator?您将运行 current_user.is_moderator。