私のアプリケーションのこの特定の部分は、店舗チェーン (H&M など) の Webshop モデルの作成を処理します。チェーンに Web ショップでもある Web サイトがある場合、1 つの Web ショップ モデルが作成されます。
Web サイトが Web ショップでない場合は、Chain モデルの文字列だけにします。
問題: チェックボックスと仮想属性を使用してこれを行っています。そのため、リクエストをチェーン コントローラに送信すると、チェックボックスで値「set_webshop」が設定されます。
# Chain Model
class Chain
has_one :webshop, :dependent => :destroy
def set_webshop
self.webshop.url == self.website unless self.webshop.blank?
end
def set_webshop=(value)
if self.webshop.blank?
value == "1" ? self.create_webshop(:url => self.website) : nil
else
value == "1" ? nil : self.webshop.destroy
end
end
end
# Chain Controller
class ChainsController < ApplicationController
def create
@chain = Chain.new(params[:chain])
respond_to do |format|
if @chain.save
flash[:notice] = 'Chain was successfully created.'
format.html { redirect_to(@chain) }
format.xml { render :xml => @chain, :status => :created, :location => @chain }
else
format.html { render :action => "new" }
format.xml { render :xml => @chain.errors, :status => :unprocessable_entity }
end
end
end
def update
params[:chain][:brand_ids] ||= []
@chain = Chain.find(params[:id])
respond_to do |format|
if @chain.update_attributes(params[:chain])
flash[:notice] = 'Chain was successfully updated.'
format.html { redirect_to(@chain) }
format.js
else
format.html { render :action => "edit" }
end
end
end
end
チェーンモデルを更新するときはすべて完璧に機能しますが、新しいモデルを作成するときはそうではありませんか? 理由がわからない?
ここに POST および PUT リクエストがあります。
# POST (Doesn't work - does not create a Webshop)
Processing ChainsController#create (for 127.0.0.1 at 2010-02-06 11:01:52) [POST]
Parameters: {"commit"=>"Create", "chain"=>{"name"=>"H&M", "set_webshop"=>"1", "website"=>"http://www.hm.com", "desc"=>"...", "email"=>"info@hm.com"}, "authenticity_token"=>"[HIDDEN]"}
# PUT (Works - does create a Webshop)
Processing ChainsController#update (for 127.0.0.1 at 2010-02-06 11:09:13) [PUT]
Parameters: { "commit"=>"Update", "chain"=> { "name" => "H&M", "set_webshop"=>"1", "website" => "http://www.hm.com", "desc" => "...", "email" => "info@hm.com"}, "authenticity_token"=>"[HIDDEN]", "id"=>"444-h-m"}
Rails の新しいモデルで virtual_attributes を処理する特別な方法はありますか?