Проблема возникает из-за того, что user.role
является нулевым.Это может произойти в любое время, особенно если внешний ключ находится в таблице ролей.
Вам необходимо защитить себя от него, используя (в зависимости от версии ruby и готовности добавить больше архитектуры в код) либо:
Безопасная навигация (начиная с ruby 2.3 и далее)
<td><%= user.role&.name %></td>
Вызов безопасного метода в стиле Rails
<td><%= user.role.try(&:name) %></td>
Метод обертки в пользовательской модели
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>
Декоратор
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>
Преимущество последнего варианта заключается в том, чтоу вас хороший интерфейс в вашем представлении, но в то же время вы не спутаете свою модель с кодом, связанным с представлением.