在Rails对象上传递nil值时出错

时间:2016-10-17 00:56:46

标签: ruby-on-rails ruby

我有一个用户有投资组合的应用。投资组合可以有多个头寸,每个头寸可以有很多动作。

我的投资组合展示页面是这样构建的:

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

<h1>Positions</h1>
<div class = 'table'>
<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Quantity</th>
      <th>Stock</th>
      <th colspan="3"></th>
    </tr>
  </thead>
<tbody id = "positions">
  <%= render @positions %>
</tbody>
</table>
</div>

<h3>New Position</h3>

<%= render 'positions/form' %>

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

我的位置部分是建立的:

<tr>
  <td class="col-md-1"><%= position.name %></td>
  <td class="col-md-1"><%= position.quantity %></td>
  <td class="col-md-1"><%= position.ticker %></td>
  <td>
    <%= form_for [@portfolio, position, @movement] do |f| %>
    <div id = "movement-errors">
      <% if @movement.errors.any? %>
        <%= render 'shared/error_messages', object: @movement %>
      <% end %>
    </div>

    <div class="field">
      <%= f.label :quantity %>
      <%= f.number_field :quantity, class: 'form-control' %>
    </div>
    <div class="actions">
       <%= f.submit class: 'btn btn-primary' %>
     </div>
    <% end %>
  </td>
</tr>

我的共享错误部分是:

<% 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 %>

当我在移动表单上提交nil值时,我希望弹出错误并告诉用户该消息。我有验证检查是否存在数量。

class Movement < ApplicationRecord
  belongs_to :position
  validates :quantity, presence: true

我的控制器动作#create动作看起来像

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 template: 'portfolios/show' }
      format.json { render json: @movement.errors, status: :unprocessable_entity }
      format.js
    end
  end
end

现在看来,当我提交一个空表单时,我使用better_errors gem得到了这个错误:

'nil'不是与ActiveModel兼容的对象。它必须实现:to_partial_path。

渲染@positions行从我的投资组合显示页面突出显示。我以为我正在实施部分路径。我的语法错了吗?

2 个答案:

答案 0 :(得分:0)

传递对象时,需要像这样分配。

<%= render partial: 'shared/error_messages', locals: {object: @movement} %>

http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables

答案 1 :(得分:0)

使用object:属性将对象传递给partial时,则部分引用该对象的名称为

e.g。

致电时

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

shared / error_messages partial将有一个引用error_messages的本地变量@movement

当我只将一个对象传递给部分时,我喜欢使用&#39;作为&#39;

e.g。

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

这允许您指定局部变量的名称。如果我传递了多个对象,我会使用@ 7urkm3n描述的方法。