0

楷模:

class User < ActiveRecord::Base
  belongs_to :role, :polymorphic => true

class Admin < ActiveRecord::Base
  has_one :user, :as => :role

class Dealer < ActiveRecord::Base
  has_one :user, :as => :role

class Buyer < ActiveRecord::Base
  has_one :user, :as => :role

经销商控制器:

  def new
    @dealer = Dealer.new
    respond_to do |format|
      format.html
      format.xml  { render :xml => @dealer }
    end
  end

  def create
    @dealer = Dealer.new(params[:dealer])
    respond_to do |format|
      if @dealer.save
        flash[:notice] = 'Dealer was successfully created.'
        format.html { redirect_to [:admin, @dealer] }
        format.xml  { render :xml => @dealer, :status => :created, :location => @dealer }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @dealer.errors, :status => :unprocessable_entity }
      end
    end
  end

错误信息:

ActiveRecord::AssociationTypeMismatch in Admin/dealersController#create User(#41048900) 预期,得到 HashWithIndifferentAccess(#23699520)

请求参数:

{"authenticity_token"=>"+GkeOOxVi1Fxl7ccbV0Ctt5R6shyMlF+3UWgRow2RdI=",
 "dealer"=>{"gender"=>"m",
 "forename"=>"",
 "surname"=>"",
 "company"=>"",
 "address1"=>"",
 "address2"=>"",
 "zipcode"=>"",
 "city"=>"",
 "country"=>"1",
 "user"=>{"email"=>"",
 "password"=>""},
 "phone"=>"",
 "mobile"=>"",
 "fax"=>""},
 "commit"=>"Submit"}

我想我的问题是 Rails 不会将请求哈希中的“用户”哈希转换为用户对象——但是为什么以及如何让 Rails 这样做呢?

4

1 回答 1

8

刚刚花了几个小时,包括碰到这个线程。终于在另一个论坛上找到了:attribute setter expect to get your params in this form

{ ...,
  "user_attributes" => {"email" => "", "password" => ""},
  ... }

不是

{ ...,
  "user" => {"email" => "", "password" => ""},
  ... }

为了得到这个,你的视图应该是这样的:

form_for @dealer do |f|
 ...
 f.fields_for :user, @dealer.user do |u|
   ...
 end
 ...
end

这适用于 Rails 3.0.3

于 2011-02-11T21:33:39.263 回答