2

基本的に私の問題は、レール アプリケーションでネストされたビューを使用しようとすると、ページの一般ユーザーと管理者の両方を保存する必要があることです。どちらにも、誰が誰であるかを知るために必要な同じ情報が含まれています。私はチームモデルを持っています:

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 %>

エラー ActiveRecord::TeamsController の 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
4

3 に答える 3

7

テーブルに存在しない列に :foreign_key オプションを設定することはできません。usersテーブルに「user_id」または「admin_id」列がありません。

いずれにせよ、Rails は外部キー列を作成しません。移行の一部として明示的に定義する必要があります。

アクティブなレコードの関連付けを参照してください

于 2013-02-15T08:26:12.020 に答える
2

@Shwetaが提案したように、

テーブルに存在しない列に:foreign_keyオプションを設定することはできません。ユーザーテーブルには「user_id」または「admin_id」列がありません。

いずれの場合も、Railsは外部キー列を作成しません。移行の一部としてそれらを明示的に定義する必要があります。

したがって、ユーザーが1つのチームにしか所属できない場合はteam_id、usersテーブルでhaveを使用する必要があります。持っている場合は、ユーザーモデルでスコープを次のように定義できます。

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アクションで、

@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

于 2013-02-15T09:22:21.700 に答える
0

外部キーとして試してくださいuser_iduser_idを呼び出しながら呼び出したいというのは、ActiveRecordはあまり賢くないと思いますadmin_id

于 2013-02-15T07:26:53.153 に答える