0

模型

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 %>

任何想法为什么会发生这种情况?谢谢你。

4

2 回答 2

1

我认为resource与 Clip 对象不同@clip

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

如果你把它改成是<%= render 'saas_admin/shared/errors', resource: @clip %>问题解决了吗?

于 2014-08-01T11:41:52.887 回答
0

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

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

更多信息请访问http://api.rubyonrails.org/classes/ActiveRecord/Base.html

于 2014-08-01T11:36:41.987 回答