Rails - 使用Best in Position更新记录

时间:2014-08-16 07:58:56

标签: ruby-on-rails erb rails-routing best-in-place

我正在构建一个市场应用程序,我尝试使用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>

已经坚持了一段时间。感谢任何帮助。

2 个答案:

答案 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

希望这有助于某人!