Ruby on rails Rails在保存错误和重新呈现页面上,显示未保存的属性&;错误

Ruby on rails Rails在保存错误和重新呈现页面上,显示未保存的属性&;错误,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,经典的Rails设置是这样的 def manage @o = Object.new end def create @o = Object.new(params) if @o.save redirect_to "something" else render "manage" end end # view for manage <div id="errors"> <% if @o.errors.any? %> <ul

经典的Rails设置是这样的

def manage
  @o = Object.new
end

def create
  @o = Object.new(params)
  if @o.save
    redirect_to "something"
  else
    render "manage"
  end
end

# view for manage
<div id="errors">
  <%  if @o.errors.any? %>
    <ul>
      <% @o.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  <% end %>
</div>

<input name="attribute" value="<%= @o.attribute %>">
def管理
@o=Object.new
结束
def创建
@o=对象。新建(参数)
如果@o.save
将_重定向到“某物”
其他的
呈现“管理”
结束
结束
#管理视图
关键的好处是,如果属性抛出错误,重新呈现的页面将显示:

  • 对象的错误
  • 未在输入字段中保存为默认值的对象属性,因此用户无需重新键入内容
太好了!但是,在我的情况下,在我的视图文件中,我还有一行代码,如下所示:

<% if @o.attribute == 2 %>
  <div id="show-this"></div>
<% end %>

如果用户试图设置
@o.attribute=2
,但由于验证错误而失败,我希望页面显示错误消息,但同时显示错误消息,因为
@o.attribute!=2
实际上,我不想显示
#show this
div。显然,我可以通过对整个对象执行
重定向
重新加载
来删除
#show this
,但这样就不会再显示错误了

我可以想出不同的方法来做到这一点,即:

  • 在自定义验证中,如果未保存,请将
    属性
    重置为nil
  • 将错误移动到闪存,该闪存可与重新加载
    @o
    重定向一起使用

但是,我想知道Rails是否已经有了这样做的方法。。。基本上,我可以轻松地重新加载一个属性,或者检查该属性的“保存后”值应该是多少?

在代码中,您可以添加

<% if @o.attribute == 2 and @o.errors.empty%>
  <div id="show-this"></div>
<% end %>


语义可以关闭,但这是处理它的简单方法。

在代码中,您可以添加

<% if @o.attribute == 2 and @o.errors.empty%>
  <div id="show-this"></div>
<% end %>


语义可以关闭,但这将是处理它的简单方法。

我还没有测试它,但是将
|124;=
添加到
管理
并在
创建
中调用
管理
可能会起作用:

def manage
  @o ||= Object.new
end

def create
  @o = Object.new(params)
  if @o.save
    redirect_to "something"
  else
    manage
  end
end

我还没有测试它,但是将
|
添加到
manage
并在
create
中调用
manage
可能会起作用:

def manage
  @o ||= Object.new
end

def create
  @o = Object.new(params)
  if @o.save
    redirect_to "something"
  else
    manage
  end
end