我的模型中有一些自定义验证用于当用户使用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 %>
答案 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")