2016-05-04 66 views
1

私はRails 4 collection_check_boxesを私のフォームに使用しています。フォームに記入し、チェックボックスのいくつかをチェックします。私は、フォームが検証エラーの後に更新されるとき、チェックされたチェックボックスが残っていることに気づいた。これはタグの機能ですか?私はドキュメントでこの情報を見つけることができませんでした。Rails 4 collection_check_boxesフォームのリフレッシュ後も永続的です

チェックボックスフォームフィールドコード:

<div class="field"> 
    <%= f.label "Area of Interest" %><br /> 
    <%= f.collection_check_boxes :interest_ids, Interest.all, :id, :name do |b| %> 
    <div class="collection-check-box"> 
     <%= b.check_box %> 
     <%= b.label %> 
    </div> 
    <% end %> 
</div> 

私はチェックボックスがフォームリフレッシュ後にチェックが、それはそれは私のために働いている機能だけではなく、偶然の一致であることを確認したかった滞在したいです。

何か情報が役に立ちました、ありがとう!

答えて

0

それは限り、あなたが失敗したセーブ/検証時にフォームをレンダリングするrender :actionの代わりredirect_to :actionを使用すると、タグの機能です:

def create 
    @user = User.create(user_params) 
    if @user.valid? 
    redirect_to action: :show 
    else 
    render :new # @user gets passed to form_for 
    end 
end 

キーの区別がありますrender :newを使用すると、作成アクションのモデルインスタンス@userがフォームに渡されます。

は今、new.html.erbビューで:

form_for @user do |f| 
    # Fields using the syntax f.text_field :attr_name, `f.collection_check_boxes :attr_name`, etc will reference the :attr_name in both @user to populate the value(s). Also, @user.errors[:attr_name] to show an error message, if present. 
end 

基本的には、何が起こっていることは、あなたのモデルにsaveの1、createvalidate、またはvalid?を呼んでいるあなたのコントローラです。これらのメソッドの1つを呼び出した後の検証に失敗すると、データベースへの保存はできませんが、失敗した値はまだ@userオブジェクトに存在しています。また、errorsオブジェクトには、更新に失敗した属性と検証が失敗した理由に関する情報が入力されるようになりました。

したがって、フォームを再レンダリングすると、モデルインスタンス自体の値からデータが入力されるため、チェックボックスが選択されたままになります。同様に、エラーを含むフィールドは、そのフィールドのエラーも表示する必要があります。

0

フォームの保存に失敗した場合にフォームをリセットする言語をコントローラに追加していない限り、検証に失敗したページの更新は「フォームの更新」と同じ動作ではないとは思わない。

フォームのinterest_idsをチェックして 'submit'を押すと、チェックに成功したチェック値がsaved:interest_idの値としてモデルに追加され、フォーム全体に障害が発生してもチェックボックスが保持されます検証。

フォームの一部が検証に失敗した場合にフォームをリセットする場合は、作成アクションのif/elseステートメントをコントローラに追加することをお勧めします。 @ object.interest_ids = []は、あなたのオブジェクトの格納されたinterest_idsを空の配列にリセットします。これにより、ボックスのチェックが外されます。

def create 
 
    @object = Object.new 
 
    if @object.save 
 
    redirect_to object_path(@object) 
 
    else 
 
    @object.interest_ids = [] 
 
    render :new 
 
    end 
 
end

関連する問題