我正在构建一个市场应用程序,我尝试使用Best in Place gem,允许卖家为每个订单添加跟踪编号。
我得到了NoMethodError,我无法解决。
NoMethodError in Orders#sales
undefined method `tracking' for nil:NilClass
错误指向视图页面中下方的最佳位置。此视图页面基于Sales(在下面的控制器中)方法,我在该方法中筛选该特定卖家的订单。
这是我的routes.rb与订单路由。由于订单无需编辑或销毁,因此我没有创建编辑或删除路线。
resources :listings do
resources :orders, only: [:new, :create, :update]
collection { post :import }
end
以下是我的订单控制器的片段
class OrdersController < ApplicationController
before_action :set_order, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!
before_action :check_user, only: [:edit, :update]
def sales
@orders = Order.all.where(seller: current_user).order("created_at DESC")
end
def update
@order.update_attributes(params[:order])
end
def check_user
if current_user.id != @seller && current_user.name != "admin admin"
redirect_to root_url, alert: "Sorry, you are not the seller of this listing"
end
end
这是我的观看页面:
<table class="table table-striped table-bordered">
<tr>
<th class="col-md-2">Image</th>
<th class="col-md-2">Item</th>
<th class="col-md-1">Price</th>
<th class="col-md-2">Customer</th>
<th class="col-md-2">Date Sold</th>
<th class="col-md-2">Shipment Tracking #</th>
<th class="col-md-1">Carrier (UPS, USPS, etc.)</th>
</tr>
<% @orders.each do |order| %>
<tr>
<td><%= image_tag order.listing.image.url(:thumb) %></td>
<td><%= order.listing.name %></td>
<td><%= number_to_currency(order.listing.price) %></td>
<td><%= order.buyer.name %></td>
<td><%= order.created_at.strftime("%B %-d, %Y") %></td>
<td><%= best_in_place @order, :tracking, :type => :input %> </td>
<td><%= best_in_place @order, :carrier, :type => :input %></td>
</tr>
<% end %>
</table>
已经坚持了一段时间。感谢任何帮助。
答案 0 :(得分:2)
我认为问题在于你在.each方法中调用了@order。
尝试:
<%= best in place order, :tracking, :type => :input %>
您还需要更改视图中的下一行。
答案 1 :(得分:1)
我明白了。问题是因为我在非Activerecord环境中使用best_in_place(作为带有订单列表的表的一部分),我需要显式传递订单ID。我在best_in_place文档https://github.com/bernat/best_in_place#non-active-record-environments
中找到了这个我为更新操作创建了自定义路由
put 'orderupdate' => "orders#update"
然后在视图中的do循环中,我使用了上面路由的自定义路径,并将订单ID传递给该路径。
<% @orders.each do |order| %>
<tr>
<td><%= order.id %></td>
<td><%= image_tag order.listing.image.url(:thumb) %></td>
<td><%= order.listing.name %></td>
<td><%= number_to_currency(order.listing.price) %></td>
<td><%= order.buyer.name %></td>
<td><%= order.created_at.strftime("%B %-d, %Y") %></td>
<td><%= best_in_place order, :tracking, :type => :input, :url => orderupdate_path(id: order.id) %> </td>
<td><%= best_in_place order, :carrier, :type => :input, :url => orderupdate_path(id: order.id) %> </td>
</tr>
<% end %>
以下是我的控制器中的更新方法:
def update
@order = Order.find(params[:id])
respond_to do |format|
if @order.update(order_params)
format.html { redirect_to sales_url, notice: 'Order updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
希望这有助于某人!