尝试在部分表单中显示错误消息

时间:2016-10-16 03:12:16

标签: ruby-on-rails

我的应用程序有一个有很多职位的投资组合。每个职位都有很多动作。

在投资组合中,我展示了我的所有职位。

<p>
  <strong>Name:</strong>
  <%= @portfolio.name %>
</p>

<%= render partial: @positions %>

<%= render 'positions/form' %>

<%= link_to 'Edit', edit_portfolio_path(@portfolio) %> |
<%= link_to 'Back', portfolios_path %>

我的位置部分写得像这样:

<ul>
  <li><%= position.name %></li>
  <li><%= position.quantity %></li>
  <li><%= position.ticker %></li>
</ul>
<%= form_for [@portfolio, position, @movement] do |f| %>
  <div id = "movement-errors">
    <% if @movement.errors.any? %>
      <%= render partial: 'movements/movement_error_messages' %>
    <% end %>
  </div>
  <div class="field">
    <%= f.label :quantity %>
    <%= f.text_field :quantity %>
 </div>
 <div class="actions">
   <%= f.submit %>
 </div>
<% end %>

我的错误部分是这样的:

<% if @movement.errors.any? %>
  <div id = "error_explanation">
    <div class = "alert alert-danger">
      The form contains <%= pluralize(@movement.errors.count, "error") %>.
    </div>
    <ul>
      <% @movement.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>

当我提交空数量时,我希望在同一页面上呈现错误消息。现在,当我提交一个空表格时,我被重定向到Movements#new页面,我有一个表单,它有一个更新按钮。

我的运动控制器构建如下:

class MovementsController < ApplicationController
  before_action :load_portfolio_and_position

  def create
    @movement = Movement.new(movement_params)
    @movement.position_id = @position.id
    @movement.update_price
    @movement.date = DateTime.now
    @movement.trade ='buy'

    respond_to do |format|
      if @movement.save
        @position.update_attribute(:quantity, (@movement.quantity + @position.quantity))
        format.html { redirect_to @portfolio, notice: 'Movement was successfully created.' }
        format.js
      else
        format.html { render :new }
        format.json { render json: @movement.errors, status: :unprocessable_entity }
        format.js
      end
    end
  end

我只想提交有效或无效的数据,并将其放在同一页面中。

1 个答案:

答案 0 :(得分:0)

在构建局部变量时使用局部变量。这使它们真正可重用和有用:

# app/views/shared/_errors.html.erb
<% if object.errors.any? %>
  <div id = "error_explanation">
    <div class = "alert alert-danger">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
    <ul>
      <% object.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>

这意味着我们可以将它渲染成:

<%= render 'shared/errors', object: @movement %>
  

我只想提交有效或无效的数据,并将其放在同一页面中。

这不是Rails的工作方式,而且有充分的理由。当您提交表单并且表单无效时,您将呈现一个显示错误消息和表单的视图,以便用户可以更正问题。

重定向将使任何用户在查询字符串中输入的数据不太安全,或依赖于以违反REST的方式使用会话。

format.html { render :new }

不会在控制器中调用新操作。它只是查找/movements/new.html.erb视图并呈现它。

您当然可以渲染任何其他想要的视图。与render template: 'foo/bar'一样。