2012-05-12 13 views
0

私はこの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 
+1

問題はリダイレクトで、代わりにレンダリングできません。 – apneadiving

+0

こんにちは@apneadiving、申し訳ありませんが、私の貧弱な言葉の質問です。コントローラは、実際にリダイレクトしないでerorでフォームをレンダリングしています。私はこれを反映するために私の質問を更新しました。 –

+0

私はこの同じ問題があります。あなたはそれを解決しましたか? – Raoot

答えて

0

私はこの質問に答えるだろうと思って回答。

最も適切な方法は、検証する必要があるすべてを手動で検証することです。したがって、フィルタにはvalidatesフィルタを使用する代わりに、コントローラでそれを行う必要があります。したがって、あなたの属性がユーザー名、電話番号、電子メールの場合は、モデルでvalidates :email, presence: trueを実行せず、コントローラで手動で行います。このように追加のパラメータがある場合は、コントローラまたはそのヘルパーに検証を行うための別の検証メソッドを追加するだけで、これを保持するチャンスが与えられます。

これは、問題を解決するための簡単な方法ではないように思われるので、これは人の時間を節約することを望みます。つまり、レールはすでに開発時間を大幅に短縮していますが、コードのほんの一部が私たちを殺すことはありません;)

関連する問題