私はこのRailscastの後にオートコンプリートアソシエーションを設定しています。検証エラーとフォームリダイレクト間で仮想属性を永続化する方法
私は別のロジックで値を渡す必要があるので、find_or_create
ではなく、virtual category_name属性にfind_or_initialize
を使用しています。
親モデルの検証が失敗した場合(railscastのProduct)、この仮想属性を保持する最良の方法は何ですか?エラーがあった場合に保存パスがフォームをレンダリングした後も、ユーザーが入力したcategory_name
を残しておきます。
値はparams[:category_name]
でアクセスできると思っていましたが、フィールドに戻すことはできません。
任意のアイデアに感謝します。
EDIT
コントローラ
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
問題はリダイレクトで、代わりにレンダリングできません。 – apneadiving
こんにちは@apneadiving、申し訳ありませんが、私の貧弱な言葉の質問です。コントローラは、実際にリダイレクトしないでerorでフォームをレンダリングしています。私はこれを反映するために私の質問を更新しました。 –
私はこの同じ問題があります。あなたはそれを解決しましたか? – Raoot