このRailscastに従ってオートコンプリートの関連付けを設定しています。
他のロジックを介して値を渡す必要があるため、仮想の category_name 属性ではfind_or_initialize
なくを使用しています。find_or_create
親モデルの検証が失敗した場合に、この仮想属性を永続化する最善の方法は何ですか (Railscast の製品)。category_name
エラーが発生した場合、保存パスがフォームをレンダリングした後もユーザーが入力したものを残しておきたい。
から値にアクセスできると思っていparams[:category_name]
ましたが、フィールドに戻すことができません。
どんなアイデアにも感謝します。
編集
コントローラ
class ProductsController < ApplicationController
...
def create
@product = current_user.products.build(params[:prerep])
if @products.save
DO SOME STUFF...
respond_to do |format|
format.html { redirect_to(@product, :notice => 'Product was successfully created.') }
format.xml { render :xml => @product, :status => :created, :location => @product }
end
else
respond_to do |format|
format.html { render :action => "new" }
format.xml { render :xml => @product.errors, :status => :unprocessable_entity }
end
end
end
end
モデル:
class Prerep < ActiveRecord::Base
attr_accessible ..., :category_name, ...
attr_reader ...
attr_accessor ...
belongs_to :user, :category
has_many ...
validates ...
def category_name
category.try(:name)
end
def category_name=(name)
product_category = Category.find_or_initialize_by_name(name) if name.present?
self.category = if product_category.new_record?
product_category ...SET SOME ATTRIBUTES...
product_category.save(:validate => false)
product_category
else
product_category
end
end
end