私の理解では、データベースに保存する空のフォームフィールドは通常デフォルトで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として上書きされます。
フィードバックや洞察が役立ちます。ありがとう!
なぜ空白を許可していますか?この問題を避けるため、通常は無効になっています。 – tadman
@tadman、申し訳ありませんが、フォームフィールドに何かが入力されていれば、オプションのフォームフィールドを追加すると考えていましたが、まだ検証済みです。フィールドをオプションにするために何か他のものを使用できるかどうかわかりませんでした。if文を 'validates:meetup_urlname'に渡す方が良いでしょうか? – teresa
もしあなたが望むのであれば、いつでもその 'if'ロジックをバリデータ自体の中にプッシュすることができます。 'if'節は通常、' validates ...、presence:true、if:...: 'のような関連メソッドを持たないものに適しています。 – tadman