Ruby on rails 如果验证失败,请在重新加载时保留更改

Ruby on rails 如果验证失败,请在重新加载时保留更改,ruby-on-rails,validation,ruby-on-rails-4,model,rails-activerecord,Ruby On Rails,Validation,Ruby On Rails 4,Model,Rails Activerecord,我正在rails中进行验证,比如: validates_presence_of :some_field 我注意到,如果验证失败,所有更改都会被数据库中的现有值覆盖。这是有道理的,因为页面基本上正在重新加载(我从开发日志中收集),但是这增加了用户错误/挫折的风险,因为一个字段中的单个错误将要求倒霉的家伙重新输入他对所有字段所做的更改 我的问题:如果验证失败,我如何让rails重新加载刚刚提交的数据?这样,用户就可以更正错误,而无需重新输入其余的修订 谢谢你的建议 编辑: 根据要求,我的更新方法如

我正在rails中进行验证,比如:

validates_presence_of :some_field
我注意到,如果验证失败,所有更改都会被数据库中的现有值覆盖。这是有道理的,因为页面基本上正在重新加载(我从开发日志中收集),但是这增加了用户错误/挫折的风险,因为一个字段中的单个错误将要求倒霉的家伙重新输入他对所有字段所做的更改

我的问题:如果验证失败,我如何让rails重新加载刚刚提交的数据?这样,用户就可以更正错误,而无需重新输入其余的修订

谢谢你的建议

编辑: 根据要求,我的更新方法如下:

def update
    @incorporation = Incorporation.find(params[:id])
    @company = @incorporation.company
    begin
        @company.name="#{params[:company][:names_attributes].values.first["name_string"]} #{params[:company][:names_attributes].values.first["suffix"]}"
    rescue NoMethodError
        @company.name="Company #{@company.id} (Untitled)"
    end
    if @company.update(company_params)
        redirect_to incorporations_index_path
    else
        redirect_to edit_incorporation_path(@incorporation)
    end
end

关于我的控制器的完整披露:上述
更新
来自我的
公司注册(controller)
,即使我正在更新我的
公司
型号<代码>公司有一个:注册成立。我这样做是因为,在我的应用程序的更大范围内,它使我的关联更加清晰。

将您的控制器更新为此

def update
    @incorporation = Incorporation.find(params[:id])
    @company = @incorporation.company
    begin
        @company.name="#{params[:company][:names_attributes].values.first["name_string"]} #{params[:company][:names_attributes].values.first["suffix"]}"
    rescue NoMethodError
        @company.name="Company #{@company.id} (Untitled)"
    end
    respond_to do |format|
        if @company.update(company_params)
            format.html { redirect_to({:action => "index"})}
        else
            format.html{render :edit}
            format.json { render json: @incorporation.errors, status: :unprocessable_entity }
        end
    end
end

要补充正确答案,您可以对代码进行大量清理:

def update
    @incorporation = Incorporation.find params[:id]

    respond_to do |format|
      if @incorporation.update company_params
        format.html { redirect_to({:action => "index"})}
      else
        format.html { render :edit }
        format.json { render json: @incorporation.errors, status: :unprocessable_entity }
      end
    end
end
如果您正在为使用
接受嵌套的属性,\u,则绝对不应该攻击前端上的关联对象

您应该查找(让模型完成工作):

#app/models/company.rb
类公司
这将允许您填充公司的
名称
。直接编辑嵌套/关联对象是一项重要任务;一种稍后会再次困扰你的黑客


答案的关键是:
render:edit

呈现编辑视图意味着您当前的
@公司
/
@公司
数据将得到维护


重定向将调用
控制器
的新实例,覆盖
@合并
,因此您在前端看到的是什么。

您能给我们看看您的def上的代码吗update@Lymuel谢谢你的回复。我已经用我的更新方法更新了我的问题。从您的请求中,我推断,理论上,验证应该在失败时加载包含提交数据的页面?感谢您的回复。上面的操作正在运行,但现在,如果出现异常,它将指向显示路线
/incorporations/3
,并使用
:edit
呈现(我本身没有任何实际问题)。但当我试图从中保存时,它似乎决定重定向到索引,而不管我输入的内容是否有效。我要求它在
update
中呈现什么也无关紧要。你知道为什么会发生这种情况吗?我以为你在成功保存后想把它重定向到你的索引,用它来转到你的节目
format.html{redirect_to@inclusion}
而不是
format.html{redirect_to({:action=>“index”})
我确实试过了。问题是,即使保存不成功,它似乎也会重定向到索引,而不管我将其定向到何处。没关系,这个问题与我对这个特定表单的路由有关。非常感谢,你的解决方案非常完美。嗨,里奇,谢谢你的回答。我一直认为在模型中填充名称是个好主意。我还没有这么做的唯一原因是,有几个控制器引用了这个模型,其中只有一个需要执行这个分配过程。(原因是在公司成立过程中,一家公司可能有许多可能的名称需要使用商标搜索进行检查),但现在我正在进行验证,可能是时候对其进行整理了。如果您给我一些上下文,如果您愿意,我将编写一些代码。诀窍是始终确保您的代码是可重用的;你的控制器代码不是,而且是黑的。这种黑客行为最终会破坏你的应用程序,你完全不知道为什么(然后花上几个小时试图修复它)。谢谢你的提议,但我想我已经找到了解决办法。我正在使用
attr\u accessor
创建一个属性
:context
,该属性指定我正在使用的控制器。基于这个值,我在模型中执行必要的特定于控制器的操作!谢谢你的回复啊!这个学生成了老师。(至少现在是这样):-D…但是如果你在寻找一个谜题,我现在正在与我刚刚发布的另一个验证相关的问题进行碰撞。(当然没有压力)
#app/models/company.rb
class Company < ActiveRecord::Base
  before_update :set_name
  attr_accessor :name_string, :name_suffix

  private

  def set_name
    if name_string && name_suffix
      self[:name] = "#{name_string} #{name_suffix}"
    else
      self[:name] = "Company #{id} (Untitled)"
    end
  end
end