我已链接user
和role
表。
我想访问用户控制器中角色表的名称属性。我使用了<td><%= user.Role.name %></td>
。
我得到undefined method 'name' error
。
答案 0 :(得分:4)
问题来自user.role
为空。这可以随时发生,特别是如果外键在角色表中。
您需要使用以下两种方法来保护自己免受攻击:(取决于ruby版本和在代码中添加更多体系结构的意愿)
安全导航(从ruby 2.3起)
<td><%= user.role&.name %></td>
轨道式安全方法调用
<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>
最后一个选项的优点是您在视图中获得了一个漂亮的界面,但是同时您也不会将模型与视图相关的代码弄混。
答案 1 :(得分:-1)
如果您的模型与角色具有has_one: :role
关系,那么,
user.role.name
将返回角色名称