0

現在、5 つのブール属性があります。私はそれらに対してカスタム検証を行います:

def limit_impacts
    i = 0
    choices = [self.first_attr, self.sec_attr, self.third_attr, self.fourth_attr, self.fifth_attr]
    choices.each do |choice|
      if choice == true
        i+=1
      end
    end
    if i > 2
      errors[:base] << ("There must be one or two impacts.")
    end
  end

2 つ以上が true に設定されているかどうかをテストし、その場合はエラーを設定します。:base error1つの属性のみに直接関係していないため、aを設定しています。

私は単に検証のためにこれを行っています:validate :limit_impacts

およびこれを処理するビューの部分:

  = f.input :first_attr, :as => :boolean

  = f.input :sec_attr, :as => :boolean

  = f.input :third_attr, :as => :boolean

  = f.input :fouth_attr, :as => :boolean

  = f.input :fifth_attr, :as => :boolean

問題は、2 つ以上のチェックボックスをオンにするとエントリが保存されず、それは正常なことですが、ビューにエラー メッセージが表示されないことです。

私は何を間違っていますか?

ちなみに、レールコンソールでテストしました:

MyModel.errors[:base]
 => ["There must be one or two impacts."]

そして、この構文も機能しません:

errors.add :base, "message"

編集:これが私のコントローラーです。編集方法についてです。

  def edit
    @page_title = t('projects.edit.title')
    @project = Project.find(params[:id])
    @steps = @project.steps
    @rewards = @project.rewards
    @project_bearer = @project.user
  end

これらの属性に関連するものはありません。

Rails コンソールからプロジェクトを作成しようとすると、 false が返されます。

2.0.0p247 :001 > t = Project.create(:social_influence => true, :environmental_influence => true, :economical_influence => true)
=> <Project all my attributes ..>
2.0.0p247 :002 > t.save
(1.2ms)  BEGIN
(2.0ms)  ROLLBACK
=> false 

解決 :

問題は、レンダリングとリダイレクトの間の私の更新方法でした。@delba のおかげで解決しました。解決策を見たい場合は、彼の回答のコメントに議論があります。

4

2 に答える 2

3

フォームを含むビューで、エラーが表示されていることを確認してください。

<%= form_for @my_model do |f|
  <% if @my_model.errors.any? %>
    <ul class="errors">
      <% @my_model.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  <% end %>

  <%# the rest of the form %>
<% end %>

コントローラーで:

def create
  @my_model = MyModel.new(my_model_params)
  if @my_model.save
    redirect_to 'blabla'
  else
    render :new
  end
end

あなたのモデルでは:

validate :limit_impacts

private

def limit_impacts
  if [first_attr, sec_attr, third_attr, fourth_attr, fifth_attr].count(true) > 2
    errors[:base] << "There must be one or two impacts."
  end
end
于 2013-09-11T13:23:46.627 に答える
0

検証方法から始めましょう。

def limit_impacts
  choices = [first_attr, sec_attr, third_attr, fourth_attr, fifth_attr]
  errors[:base] << "There must be one or two impacts." if choices.count(true) > 2
end

ずっときれいですね。:)

エラーを表示するレイアウト/ビュービットを見せていただけますか? その後、回答を更新します。

于 2013-09-11T13:03:41.460 に答える