自定义验证错误消息未显示在视图中

时间:2014-04-09 10:39:14

标签: ruby-on-rails validation model

我的模型中有一些自定义验证用于当用户使用simple_form提交URL时,但我似乎无法获得与每个自定义验证关联的错误消息以显示在视图中(但验证似乎有效) ?

我看到的唯一错误是create方法中定义的错误。任何指导都将不胜感激....

模型

class Product < ActiveRecord::Base

validates :url, presence: true
validate :check_source, :must_contain_product_id

def check_source         

    valid_urls = ["foo", "bar"]

    errors.add(:url, "Must be from foo or bar") unless valid_urls.any? {|mes| self.url.include? mes}
end

def must_contain_product_id         

    errors.add(:url, "Must be product page") unless self.url.include? "productID"

end                                                            

end

控制器

def create

    @product = Product.new


    if @product.save
        flash[:success] = "Product added to your list"
        redirect_to root_path

    else
        flash[:message] = "Sorry we can't add this product"
        redirect_to root_path
    end

end

查看(使用Simple_form)

# Various messaging I've tried
  <% if flash[:success].present? %>
      <div data-alert class="alert-box success">
        <%= flash[:success] %>
      </div>
  <% end %>

  <% if flash[:error].present? %>
      <div data-alert class="alert-box">
        <%= flash[:error] %>
      </div>
  <% end %>

  <% if flash[:message].present? %>
      <div data-alert class="alert-box">
        <%= flash[:message] %>
      </div>
  <% end %>

  <% if @product.errors.any? %>
      <div id="error_explanation">
        <h2><%= pluralize(@product.errors.count, "error") %> prohibited this post from being saved:</h2>

        <ul>
        <% @product.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
        </ul>
      </div>
<% end %>


# The actual form...

<%= simple_form_for Product.new do |form| %>

<%= form.input :url, maxlength: false %>

<%= form.button :submit, "Get Product", data: { disable_with: "Retrieving product ..." } %>

<% end %>

5 个答案:

答案 0 :(得分:0)

我使用以下方法解决了同样的问题:

errors.add(:base, "message here")

然而,这不会被分配到特定的表格输入(例如网址),这在我的情况下是不必要的

答案 1 :(得分:0)

无论保存是否成功,您都会重定向到create action中的root_path。您对“产品”表单的视图包含闪存的div,但除非root_path的视图也呈现flash div,否则您将无法看到它们。

答案 2 :(得分:0)

我认为您需要重定向到产品或进行编辑。否则您将无法看到错误,因为您不在应显示的页面上。 试试

def create

   @product = Product.new


   if @product.save
       flash[:success] = "Product added to your list"
       redirect_to root_path

   else
       flash[:message] = "Sorry we can't add this product"
       render 'edit'
   end

end

答案 3 :(得分:0)

errors.add(:base, "message")

这是在自定义验证中添加消息的正确语法。

答案 4 :(得分:0)

如果您重定向平均值并且变量不会属于您的部分,请查看您重定向到 root_path 的代码。

因此您必须更改代码,

def create

  @product = Product.new
  if @product.save
    flash[:success] = "Product added to your list"
    redirect_to root_path

  else
    flash[:message] = "Sorry we can't add this product"
    render :action =>  "new"
  end

end

之后在模型中而不是

errors.add(:url, "Must be from foo or bar") 

请尝试这样:

errors[:base] << ("Must be from foo or bar")