2016-11-16 6 views
0

私の理解では、データベースに保存する空のフォームフィールドは通常デフォルトでnilになります。しかし、私のオプションのフォームフィールドのうちの2つは、nilではなくempty( "")として保存されています。Rails:データベースに保存するフォームフィールドは、デフォルトでnilではなくemptyに設定されます。

私はこのことがわかりません。Understanding Rails validation: what does allow_blank do?Save blank value as nil in databaseは、私がallow_blank: trueを使用している可能性があると考えています。

マイgroup.rb

# meetup_urlname must be unique 
validates :meetup_urlname, uniqueness: { case_sensitive: false, message: "this is already being used by a different group" }, allow_blank: true 


# only validate if meetup_apikey or if meetup_urlname is non-empty 
validate :url_name_valid?, :if => :meetup_urlname? 
validate :api_key_valid?, :if => :meetup_apikey? 

_Form.html.erb:

<%= bootstrap_form_for(@group, :html => { :multipart => true }, layout: :horizontal, label_col: "col-sm-3", control_col: "col-sm-9") do |f| %> 
... 
    <h5>Import Events from Meetup</h5> 

    <div class="field"> 
    <%= f.text_field :meetup_urlname, label: "Meetup Group's URL", type: "text", placeholder: "Enter your Meetup group's url to retrieve your events", prepend: 'http://www.meetup.com/' %> 
    </div> 

    <div class="field"> 
    <%= f.text_field :meetup_apikey, label: 'Meetup API Key', placeholder: 'Enter your Meetup API key (Required for advanced meetup functionality)' %> 
    </div> 

<%= f.hidden_field :status %> 
<%= f.hidden_field :audit_status %> 
<%= f.hidden_field :sref %> 

<div class="col-sm-10" style="padding-right: 26px;"> 
    <div class="actions pull-right"> 
    <%= f.submit 'Update Group', class: "action-btn btn-rounded btn-large" %> 
    </div> 
</div> 

<% end %> 

オプションのフォームフィールドを持ってする方法はあります保存nilの代わりに空のデフォルトでは、として?現在、フォームフィールドがempty..itを返した場合、nilとして上書きされます。

フィードバックや洞察が役立ちます。ありがとう!

+0

なぜ空白を許可していますか?この問題を避けるため、通常は無効になっています。 – tadman

+0

@tadman、申し訳ありませんが、フォームフィールドに何かが入力されていれば、オプションのフォームフィールドを追加すると考えていましたが、まだ検証済みです。フィールドをオプションにするために何か他のものを使用できるかどうかわかりませんでした。if文を 'validates:meetup_urlname'に渡す方が良いでしょうか? – teresa

+0

もしあなたが望むのであれば、いつでもその 'if'ロジックをバリデータ自体の中にプッシュすることができます。 'if'節は通常、' validates ...、presence:true、if:...: 'のような関連メソッドを持たないものに適しています。 – tadman

答えて

0

strip_attributes gemがこれを処理できます。

https://github.com/rmm5t/strip_attributes

+0

この宝石は私のために働くようですが、他の場所で私のアプリを壊すかどうかわからない他のもの。条件が満たされたときだけ検証するオプションのフォームフィールドに書き込む別の方法はありますか?ありがとう。 – teresa

0

あなたはもっと文脈を投稿できますか?私たちがここに持っているもので

、私のアイデアがあります:

  1. ""おそらく、あなたがどこかto_s:meetup_urlname上を呼んでいる
  2. (それを貼り付けてください)ビューのどこかから来ていますか? nil.to_sは、ルビーで""を返します。
+0

それは面白いです。私はこれが空のまま保存される理由かもしれないと思います。ビューから '_form.html.erb'を投稿しましたが、問題はありません。 'meetup_urlname'や' meetup_apikey'のどこにでも 'to_s'を呼び出していません。 – teresa

関連する問題