2017-12-01 8 views
1

ユーザーは自分の誕生日を追加できるフォームがあります。今現在、誰かがこのフォームを送信すると、入力された日付が常に値を持つので、彼は誕生日を追加します。Rails:フォームに指定したときの更新属性のみ

チェックボックスを追加する方法はありますか?チェックされている場合のみ、誕生日をレコードに保存する必要がありますか?チェックボックスにチェックが入っていない場合は、birthdayの現在の値を削除する必要があります。コントローラで

= simple_form_for resource, as: resource_name, url: registration_url(resource_name) do |f| 
    = f.input :another_field 
    = f.input :birthday_set?, as: :boolean # or something else? 
    = f.input :birthday 
    = f.input :submit 
+0

この最も単純な方法は、birthday_setパラメータを追跡するbefore_saveコールバックを使用し、falseの場合はbirthdayをnullに設定することです。http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html – atomAltera

+0

@atomAltera is not私は 'attr_accessor'も必要とするので、より簡単な方法があります。 – jonhue

+0

コントローラレベルでこれを解決する必要があります。モデル作成に必要なすべてのフィールドを返すcreate_paramsヘルパーがあるとします。そのヘルパーの内部でこのチェックを行うことができます。 – atomAltera

答えて

0

、あなたのような何かを行うことができます:

def create 
    user = User.new 
    user.birthday = params[:user][:birthday_set?] ? params[:user][:birthday] : nil 
    params[:user].delete(:birthday, :birthday_set?) 
    user.update_attributes(user_params) 
    ... 
end 

をそして、ちょうどあなたのparamsのpermit要素から:birthday/:birthday_set?キーを削除します。

:birthday_set?form_tagフィールドに移動すると、params[:user]の外にあるので、パラメータからクリアする心配はありません。あなたがdbにそれを格納していないなら、これはとにかくもっと意味があります。

これにより、unpermitted parametersがスローされるのを避けることができます。

フロントエンドの:birthdayフィールドを無効にするには、チェックボックスをオンにするとjsを使用しますが、これに関係なくこれを処理することもできます。

個人的には、@ atomAlteraのルートに行き、attr_accessorbefore_saveを使用しますが、これを避けるには、この方法が有効です。

関連する問題