我有一个用户有投资组合的应用。投资组合可以有多个头寸,每个头寸可以有很多动作。
我的投资组合展示页面是这样构建的:
<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行从我的投资组合显示页面突出显示。我以为我正在实施部分路径。我的语法错了吗?
答案 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描述的方法。