在show.html&中没有显示外键值而不是ID的方法错误index.html ruby​​ on rails

时间:2015-08-22 15:00:04

标签: ruby-on-rails

我有三种模式:用户,语言和角色。用户模型拥有语言和角色的外键。用户(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是一种方法,而不是模型角色中的字段。 为什么相同的语法适用于语言而不适用于角色?

提前致谢:)

1 个答案:

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