我有三种模式:用户,语言和角色。用户模型拥有语言和角色的外键。用户(belongs_to:语言)和(belongs_to:role)。语言和角色(has_many:用户)
class User < ActiveRecord::Base
belongs_to :language
belongs_to :role
end
class Language < ActiveRecord::Base
has_many :users
end
class Role < ActiveRecord::Base
has_many :users
end
在 _form.html.erb 中,我使用以下代码选择语言的值iso_code和角色名称。
<div class="field">
<%= f.label t("language") %><br>
<%= f.collection_select :language_id, Language.order(:iso_code),:id,:iso_code, include_blank: false %>
</div>
<div class="field">
<%= f.label t("Role") + '?' %><br>
<%= f.collection_select :type_role_id, Role.order(:name),:id,:name, include_blank: false %>
</div>
到这里一切正常。用户选择值(例如:es),代码将主键保存在数据库中。 (例如:2)
在 show.html.erb 中,显示我使用以下代码的值:
<%= @user.language.iso_code %>
效果很好!
当我尝试为角色执行完全相同的问题时出现问题:
<%= @user.role.name %>
我收到错误消息:
NoMethodError in Users#show
<%= @user.role.name %>
undefined method `name' for nil:NilClass
Rails认为name是一种方法,而不是模型角色中的字段。 为什么相同的语法适用于语言而不适用于角色?
提前致谢:)
答案 0 :(得分:1)
您需要将值保存在role_id
而不是type_role_id
中。将collection_select
更改为
<div class="field">
<%= f.label t("Role") + '?' %><br>
<%= f.collection_select :role_id, Role.order(:name),:id,:name, include_blank: false %>
</div>
现在您可以执行<%= @user.role.name %>
,它会为您提供相关用户对象的角色名称。
<强> 更新 强>
如果您在role_id
表中没有users
,请尝试创建迁移以将role_id
添加到users
表,或者您可以创建迁移以重命名{ {1}}也可以family_role_id
。
最后做role_id