0

STIを使用していくつかのモデルをセットアップしています

人<ActiveRecod....。

おとこ

女性

タイプフィールドを指定しましたが、新しいレコードの作成は正常に機能します。サブタイプ(男性または女性)はレコードとともに正常に保存され、タイプ列のは正しいタイプです。

ただし、レコードを更新/編集しようとすると、SQLUPDATEが呼び出されません。update_attributesはtrueを返します。ログはSELECTの呼び出しを示していますが、UPDATEは呼び出されていません。

フォームからタイプフィールドを削除した場合。保存する新しいレコードを作成します。ただし、タイプフィールドはnullです。しかし、その後、レコードを更新できます。

これを修正するためのアイデアや回避策はありますか?

コントローラコード

# GET /persons/new
# GET /persons/new.json
def new
   @person = current_user.persons.build(params[:person])
   @person.type = params[:type]    


    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @pass }
    end
end

 # GET /persons/1/edit
 def edit
   @person = Person(params[:id])
 end

# POST /persons
# POST /persons.json
def create
@person = current_user.persons.build(params[:person])

respond_to do |format|
  if @person.save
    format.html { redirect_to @person, notice: 'Person was successfully created.' }
    format.json { render json: @person, status: :created, location: @pperson }
  else
    format.html { render action: "new" }
    format.json { render json: @person.errors, status: :unprocessable_entity }
  end
 end
end

# PUT /persons/1
# PUT /persons/1.json
def update
@person = Person.find(params[:id])

respond_to do |format|
  if @person.update_attributes(params[:person])

    format.html { redirect_to @person, notice: 'Person was successfully updated.' }
    format.json { head :no_content }
  else

    format.html { render action: "edit" }
    format.json { render json: @person.errors, status: :unprocessable_entity }
  end
end
end

私が新しいと呼ぶとき、それはサブクラスのためになるでしょう、すなわち

<%= link_to "New Woman", new_woman_path %>

私はこれのために準備されたルートを持っています、すなわち

resources :women, :controller => "persons", :type => "Woman"
resources :men, :controller => "persons", :type => "Man"

私が問題を抱えている場所である編集を呼び出すとき、すなわち

<%= link_to 'Edit', edit_person_path(@person) %>

コンソールでレコードを作成および編集する場合は注意してください。作成され、更新されます。

4

1 に答える 1

2

さて、ネストされた属性は赤いニシンでした。問題はSTIにあります

Railsフォームヘルパーガイドには、STIによるレコードの識別に依存することはできないと書かれています。

form_forで、IDをベースタイプIDに一致させる必要があります。そうしないと、編集が失敗します。

それで

<%= form_for(@person)do | f | %>は

<%= form_for(@ person.becomes(Person)do | f |%>html出力の違いを見ると

問題のhtmlは、.becomesを使用するときに編集モードで、edit_room_fieldnameのようなIDを取得すると、edit_woman_fieldnameのようなIDを作成します。いずれの場合も、保存して更新します。

于 2012-10-26T10:51:07.557 に答える