基本上我的问题是,当我在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
答案 0 :(得分:6)
您不能将:foreign_key选项设置为表中不存在的列。 您的用户表没有“user_id”或“admin_id”列。
在任何情况下,Rails都不会为您创建外键列。您需要在迁移过程中明确定义它们。
答案 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
。