Rails没有更新记录,即使我知道至少有一个错误也没有显示错误

时间:2014-08-01 11:30:35

标签: ruby-on-rails ruby-on-rails-4 ruby-2.1

模型

class Clip < ActiveRecord::Base
  validates_length_of :description, maximum: 160
end

控制器

  def update
    @clip = @film.clips.find_by_permalink(params[:id])

    respond_to do |format|
      if @clip.update(clip_params)
        format.html { redirect_to saas_admin_studio_film_path(@studio, @film), notice: 'Clip was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @clip.errors, status: :unprocessable_entity }
      end
    end
  end

查看

<%= render 'saas_admin/shared/errors', resource: resource %>

<%= resource %>生成#<Clip:0x0000010c6c64e0>,因此会加载资源。但是,<%= resource.errors.any? %>会返回false。如果我将控制器@clip.update(clip_params)更改为@clip.update!(clip_params),我会:

Validation failed: Description is too long (maximum is 160 characters)

因此验证有效,只是.errors没有将其显示出来。

_errors

<% if resource.errors.any? %>
    <ul>
    <% resource.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
<% end %>

为什么会发生这种情况?谢谢。

2 个答案:

答案 0 :(得分:1)

我不认为resource@clip是相同的Clip对象。

您在代码中的哪个位置指定@clipresource?我根本看不到你在哪里定义resource

如果您将其更改为<%= render 'saas_admin/shared/errors', resource: @clip %>问题是否已解决?

答案 1 :(得分:0)

正如您所看到的,虽然它可能看起来倒退,但更新和更新之间的主要区别!是如何处理失败的保存。

更新ActiveRecord类时!如果记录无效,版本将引发异常。

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

的更多信息