Ruby on rails Rails 4:在“";渲染:编辑";内部控制器

Ruby on rails Rails 4:在“";渲染:编辑";内部控制器,ruby-on-rails,validation,Ruby On Rails,Validation,我有一个控制器 def update @patient = Patient.find(@score.patient_id) respond_to do |format| if @score.update(score_params) format.html { redirect_to score_path(@score), notice: 'Score was successfully updated.' } format.json { r

我有一个控制器

 def update
    @patient =  Patient.find(@score.patient_id)
    respond_to do |format|
      if @score.update(score_params)
      format.html {  redirect_to score_path(@score), notice: 'Score was successfully updated.' }
      format.json { render :show, status: :ok, location: @score }
  else
      format.html { render :edit }
      format.json { render json: @score.errors, status: :unprocessable_entity }
    end
   end
  end
编辑“分数”对象并通过验证后,一切正常

然而(问题就在这里),在侧边栏中我有一个“此分数的当前条目”框,它基本上显示了对象的当前条目。它看起来像这样:

 <div class = "CompletionFrame">
   <div class="page-header">
   <h4>Your scores for this case</h4>
   </div>
 </div>

 <ol>
   <%= @score.exists(@score.dx1, @score.dxcon1) %>
   <%= @score.exists(@score.dx2, @score.dxcon2) %>
   <%= @score.exists(@score.dx3, @score.dxcon3) %>
   <%= @score.exists(@score.dx4, @score.dxcon4) %>
   <%= @score.exists(@score.dx5, @score.dxcon5) %>
</ol>

你对这个案子的分数
属性的细节并不重要。奇怪的是,如果我尝试使用无效属性进行更新,控制器会呈现编辑视图,但无效条目会显示在“此分数的当前条目”中。如果我转到另一个页面,然后再返回到此页面,则会显示旧的(未编辑的)条目。换句话说,无效条目不会被保存,但它们会显示在控制器的初始render:edit调用中

我的问题是:

为什么会这样

如何防止对单个“渲染”的侧边栏进行更新


我希望这是有道理的

update方法更改实例变量对象的局部值,然后尝试保存它。如果验证失败(因为本地值未通过验证),则该对象不会保存到数据库中,但它的实例变量(保存字段数据)中仍有数据。换句话说,它与从数据库中加载的版本不同

当您执行
render
时,它会使用@score变量呈现页面,您已经为该变量更改了本地数据

重新加载页面时,通过从数据库加载对象来设置该对象,从而获取“旧的”有效数据

在验证失败时呈现编辑页面非常有用,因为您可以在表单中显示有关验证失败的字段的信息:例如,突出显示问题字段并显示一些有用的反馈


如果您的编辑页面正在执行其他依赖于对象具有有效数据的操作,那么您应该重定向到该对象,而不仅仅是渲染,这将使rails重新加载对象,或者将失败的对象保存到其他地方使用的变量中,以便您可以在页面上显示保存的数据,并且仍然将失败的对象(带有验证错误等)保存在表单中。

update方法更改实例变量对象的局部值,然后尝试保存它。如果验证失败(因为本地值未通过验证),则该对象不会保存到数据库中,但它的实例变量(保存字段数据)中仍有数据。换句话说,它与从数据库中加载的版本不同

当您执行
render
时,它会使用@score变量呈现页面,您已经为该变量更改了本地数据

重新加载页面时,通过从数据库加载对象来设置该对象,从而获取“旧的”有效数据

在验证失败时呈现编辑页面非常有用,因为您可以在表单中显示有关验证失败的字段的信息:例如,突出显示问题字段并显示一些有用的反馈

如果您的编辑页面正在执行其他依赖于对象具有有效数据的操作,那么您应该重定向到该对象,而不仅仅是渲染,这将使rails重新加载对象,或者将失败的对象保存到其他地方使用的变量中,以便您可以在页面上显示保存的数据,并且表单中仍然有失败的对象(带有验证错误等)