неопределенный метод `name 'для nil: NilClass, при доступе к атрибуту' name 'в другой модели - PullRequest
0 голосов
/ 22 января 2019

Я связал user и role таблицу.
Я хочу получить доступ к атрибуту имени таблицы ролей в пользовательском контроллере. Я использовал <td><%= user.Role.name %></td>.

Я получаю undefined method 'name' error.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Проблема возникает из-за того, что user.role является нулевым.Это может произойти в любое время, особенно если внешний ключ находится в таблице ролей.

Вам необходимо защитить себя от него, используя (в зависимости от версии ruby ​​и готовности добавить больше архитектуры в код) либо:

  1. Безопасная навигация (начиная с ruby ​​2.3 и далее)

    <td><%= user.role&.name %></td>
    
  2. Вызов безопасного метода в стиле Rails

    <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>
    

Преимущество последнего варианта заключается в том, чтоу вас хороший интерфейс в вашем представлении, но в то же время вы не спутаете свою модель с кодом, связанным с представлением.

0 голосов
/ 22 января 2019

Если ваша модель имеет has_one: :role отношение с ролью, то user.role.name вернет имя роли

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...