在包含的部分内容中,如何呈现包含验证错误的原始页面

时间:2017-06-24 20:18:59

标签: ruby-on-rails validation simple-form erb

我有一个页面,其中部分包含我的rails app(5.1.1)中的表单

我使用的是simple_form gem。

此页面用于显示旅程的详细信息,其中包含许多腿。在旅程视图中,我们为腿部视图渲染部分"_form"。此视图包含一个表单,用于创建要添加到旅程中的新分支,在这种情况下,将从'show'旅程视图中呈现。

的旅程/ show.html.erb

<div class="container">
<div class="col-xs-12">
 <h3><%= @journey.name %></h3>
 <h4><%= @journey.legs.count %> <%= "leg".pluralize(@journey.legs.count) %> covering <%= @journey.total_distance.round(1) %> <%="mile".pluralize(@journey.total_distance)%>!</h4>

 <hr/>
 <h4><%= (@journey.has_legs) ? 'Add another leg to the journey' : "Your journey has no legs, and we all know a journey can't go far without its legs! Quick...give it some legs..." %></h4>

    <%= render partial: "legs/form", locals: {leg: @new_legs.first} %>


<%= link_to 'Edit', edit_journey_path(@journey) %> |
<%= link_to 'Back', journeys_path %>
</div>

当正在创建的腿上发生验证错误时,由于腿的创建动作代码 - 它呈现腿的新视图,该视图在新视图上工作并显示所有错误等腿。这是由于腿控制器上的以下动作代码:

创建腿部动作

def create
    @leg = Leg.new(leg_params)
    respond_to do |format|
      if @leg.save
        format.html { redirect_to @leg, notice: 'leg was successfully created.' }
        format.json { render :show, status: :created, location: @leg }
      else
        format.html { render :new }
        format.json { render json: @leg.errors, status: :unprocessable_entity }
      end
    end
  end

然而,我想呈现这段旅程&#34; show&#34;查看显示所有错误的视图,如:腿的新视图。

我知道您可以执行render "journeys/show"呈现旅程的展示视图,但是,它不会在呈现的部分"legs/form"中保留验证错误。

如何渲染旅程显示视图,确保将所有验证错误传递给包含的部分?我尝试过使用redirect_back(fallback_path=>root_url),但这并不会导致错误。

请帮忙!

2 个答案:

答案 0 :(得分:0)

答案相对简单 - 多亏了freenode #rubyonrails的帮助渠道。

传递一个控制器创建的@leg实例的部分,这个@leg对象将是一个新对象,或者它将是包含所有错误的旧对象。

在旅程秀控制器中创建@leg,在leg创建操作中,如果失败,从@ leg.journey创建一个@journey实例变量然后渲染“journeys / show”等等,一切都按预期工作

答案 1 :(得分:-2)

更新:这不是最好的建议,但可以让你找到正确的方向。我认为这听起来像How to display Ruby on Rails form validation error messages one at a time 在这里它还描述了http://guides.rubyonrails.org/v2.3.11/activerecord_validations_callbacks.html#errorsadd 在我的情况下,我使用此功能没有数据库验证: 控制器:

def create
      ...
      flash.now[:danger] = 'Invalid data'
      render 'index'
end

查看index.html.erb

<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %>"><%= message %></div>
<% end %>