Rails不生成验证失败消息

ste*_*ron 6 ruby-on-rails ruby-on-rails-3.1

我的模型中有许多标准的rails验证:

validates_presence_of :url_string
validates_uniqueness_of :url_string
validates_presence_of :stream_source
validates_presence_of :width
validates_presence_of :height
validates_presence_of :name
validates_uniqueness_of :name
validates_presence_of :customer_name
validates_presence_of :iframe_background_color
Run Code Online (Sandbox Code Playgroud)

如果我没有在我的表单中填写其中一个字段,那么我将按照预期返回到表单,但奇怪的是没有显示错误消息.我使用下面的代码来显示错误消息:

<% @camera.errors.full_messages.each do |error| %>
  <p><%= error %></p>
<% end %
Run Code Online (Sandbox Code Playgroud)

我还试图打印出@ camera.errors对象,这就是显示的内容:

#<ActiveModel::Errors:0x12db19bc @base=#<Camera id: 1, stream_source: "test", width: 640, height: 360, active: true, name: "test", url_string: "CAYD19Vp", customer_name: "test", iframe_background_color: "#FFFFFF", online: true, created_at: "2011-08-30 15:54:16", updated_at: "2011-09-06 15:52:48", audio: true, iframe_text_color: "#FF00FF", iframe_link_color: "#FF0000", notes: "Some notes!", offline_image_file_name: "Cake.jpg", offline_image_content_type: "image/jpeg", offline_image_file_size: 196591, offline_image_updated_at: "2011-09-06 12:12:38", pull_stream_url: "test", bitrate: "300-500", show_branding: false>, @messages={}>
#
Run Code Online (Sandbox Code Playgroud)

如您所见,消息哈希是空的.我尝试通过执行以下操作手动设置验证错误消息:

validates_presence_of :name, :message => "No name present" 
Run Code Online (Sandbox Code Playgroud)

但它也没有填充消息哈希.

控制器更新操作如下所示:

def update
  @camera = Camera.find(params[:id])
  if @camera.update_attributes(params[:camera])
    flash[:notice] = "Camera updated"
    redirect_to nwcadmin_camera_path
  else
    redirect_to :action => :edit
  end 
end 
Run Code Online (Sandbox Code Playgroud)

我使用Ruby版本ruby 1.9.2p290和Rails版本3.1.0.

任何帮助都会很棒!

谢谢

Vik*_*ary 6

只是提醒您,Validation failed (ActiveRecord::RecordInvalid)如果您有before_validation声明并且其中任何一个返回,您将收到一条错误,并显示一条空错误消息(如果没有其他错误)false.

请注意,before_validation回调不能返回false(nil可以)并且这可能偶然发生,例如,如果您false在该回调方法中的最后一行中分配布尔属性.在你的回调方法中明确地写回return以使其工作(或者如果你的回调是一个块(如这里所述),则在结尾处为true ).

更新:这将不再是启动Rails 5.0的问题,因为return false将不再停止回调链(throw :abort现在将暂停回调链).

更新:ActiveRecord::RecordNotSaved: Failed to save the record如果回调返回,您可能还会收到false.


ste*_*ron 5

我设法解决了问题的根源.在我使用的控制器中:

redirect_to :action => :edit
Run Code Online (Sandbox Code Playgroud)

我应该一直在使用:

render :action => :edit
Run Code Online (Sandbox Code Playgroud)

通过使用redirect_to,我在控制器中执行编辑操作,然后从数据库中获取新的相机对象,而不是保留更新操作中的当前相机对象.