未知属性:admin_id,具有嵌套视图和has_many关系

时间:2013-02-15 06:52:10

标签: ruby-on-rails ruby ruby-on-rails-3.2

基本上我的问题是,当我在rails应用程序中尝试使用嵌套视图时,我需要存储页面的一般用户和管理员。两者都包含我需要知道谁是谁的相同信息。我有一个团队模型:

class Team < ActiveRecord::Base
  attr_accessible :auth_token, :team_name, :template
  has_many :events, :dependent => :destroy
  has_many :users
  has_many :admins, :class_name => "User", :foreign_key => 'admin_id'
  accepts_nested_attributes_for :admins
end

我的Teams表的架构包含一个admin_id字段。我不明白为什么我会收到这个错误。我已经尝试了相当多的谷歌搜索和搜索论坛,尽管发现了一些类似的问题,我找不到所有相同的问题组合。

提前致谢。

修改 用户模型:

class User < ActiveRecord::Base
    require 'digest/sha1'
    attr_accessor :pre_pass
    belongs_to :team
    attr_accessible :name, :player
    attr_protected :password
    validates :name, :presence => true
    validates :pre_pass, :presence => true
    before_save :encrypt_pass
    after_save :clear_pre_pass
end

团队/新视图

<%= form_for(@team) do |f| %>
  <% if @team.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@team.errors.count, "error") %> prohibited this team from being saved:</h2>

      <ul>
      <% @team.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :team_name %><br />
    <%= f.text_field :team_name %>
  </div>
  <div class="field">
    <%= f.label :template %><br />
    <%= f.number_field :template %>
  </div>
  <div class="field">
    <%= f.label :auth_token %><br />
    <%= f.number_field :auth_token %>
</div>
    <p>
        <%= f.fields_for :admins do |builder| %>
            <%= render "admin_fields", :f => builder %>
        <% end %>
    </p>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

错误     TeamsController中的ActiveRecord :: UnknownAttributeError#new

unknown attribute: user_id

app / controllers / teams_controller.rb:28:in“new”

TeamController #new

def new
    @team = Team.new
    @team.admins.build
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @team }
    end
end

3 个答案:

答案 0 :(得分:6)

您不能将:foreign_key选项设置为表中不存在的列。 您的用户表没有“user_id”或“admin_id”列。

在任何情况下,Rails都不会为您创建外键列。您需要在迁移过程中明确定义它们。

请参阅Active Record Associations

答案 1 :(得分:2)

正如@Shweta建议的那样,

  

您不能将:foreign_key选项设置为表中不存在的列。您的用户表没有“user_id”或“admin_id”列。

     

在任何情况下,Rails都不会为您创建外键列。您需要在迁移过程中明确定义它们。

因此,如果用户只能属于一个团队,那么您应该在users表中使用team_id。如果您拥有它,那么您可以在用户模型中将范围定义为:

scope :admins, where(:player => 'Admin') # I am assuming player is keeping Admin/Member.

在你的团队模型中替换

has_many :admins, :class_name => "User", :foreign_key => 'admin_id'
accepts_nested_attributes_for :admins

accepts_nested_attributes_for :users

在你的Teams#new action中,替换

@team.admins.build

@team.users.build

最后,在您看来,如果您使用的是fields_for

<%= f.fields_for :users do |admin| %>
  <%= admin.hidden_field :player, :value => 'Admin' %>
  <% add other user fields %>
<% end %>

现在,您可以通过@team.users.admins

获取团队的管理员

答案 2 :(得分:0)

尝试user_id作为foreign_key。我认为ActiveRecord并不是那么明智,因为您想在调用user_id时致电admin_id