未定义方法nil:NilClass的方法“名称”,而在其他模型中访问属性“名称”

时间:2019-01-22 09:43:23

标签: ruby-on-rails ruby

我已链接userrole表。
我想访问用户控制器中角色表的名称属性。我使用了<td><%= user.Role.name %></td>

我得到undefined method 'name' error

2 个答案:

答案 0 :(得分:4)

问题来自user.role为空。这可以随时发生,特别是如果外键在角色表中。

您需要使用以下两种方法来保护自己免受攻击:(取决于ruby版本和在代码中添加更多体系结构的意愿)

  1. 安全导航(从ruby 2.3起)

    <td><%= user.role&.name %></td>
    
  2. 轨道式安全方法调用

    <td><%= user.role.try(&:name) %></td>
    
  3. 用户模型中的包装器方法

    class User < ...
      def role_name
        role.name if role
        # or role&.name
      end
    
      # equivalently, this defines a safe `role_name` method.
      delegate :name, to: :role, prefix: true, allow_nil: true
    end
    
    <td><%= @user.role_name %></td>
    
  4. 装饰器

    class UserDecorator < Draper::Decorator # for instance
      decorates :user
    
      delegate_all
      delegate :name, to: :role, prefix: true, allow_nil: true
    end
    
    class YourController < ...
      def show
        ...
        @user = UserDecorator.new(user)
      end
    end
    
    <td><%= @user.role_name %></td>
    

最后一个选项的优点是您在视图中获得了一个漂亮的界面,但是同时您也不会将模型与视图相关的代码弄混。

答案 1 :(得分:-1)

如果您的模型与角色具有has_one: :role关系,那么, user.role.name将返回角色名称