【问题标题】:Rails missing parameters id=> nilRails 缺少参数 id=> nil
【发布时间】:2015-09-18 08:39:21
【问题描述】:

在我的 ruby​​ on rails 应用程序中,我有一个名为 _cart.html.erb 的部分

<h2>Your Cart</h2>
<table>

  <%= render(cart.line_items) %>

  <tr class="total_line">
    <td colspan="2">Total</td>
    <td class="total_cell"><%= number_to_currency(cart.total_price) %></td>
  </tr>

</table>

<%= button_to 'Checkout', new_order_path, method: :get %>
<%= button_to 'Empty cart', cart, method: :delete,
    data: { confirm: 'Are you sure?' } %>

如果购物车有一个或多个 line_items 我可以下订单,在购物车控制器中我检查购物车是否有一些 line_items:

class OrdersController < ApplicationController
  include CurrentCart
  before_action :set_cart, only: [:new, :create]
  before_action :set_order, only: [:show, :edit, :update, :destroy]

  # GET /orders/new

  def new
    if @cart.line_items.empty?
      redirect_to store_url, notice: "Your cart is empty"
      return
    end

    @order = Order.new
  end
  # POST /orders
  # POST /orders.json
  def create
    @order = Order.new(order_params) 
    @order.add_line_items_from_cart(@cart)

    respond_to do |format|
      if @order.save
        format.html { redirect_to @order, notice: 'Order was successfully created.' }
        format.json { render :show, status: :created, location: @order }
      else
        format.html { render :new }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end
end

CurrentCart 模块在哪里

module CurrentCart
  extend ActiveSupport::Concern

  private

    def set_cart 
      @cart = Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound
      @cart = Cart.create
      session[:cart_id] = @cart.id
    end
end

而模型Order是:

class Order < ActiveRecord::Base
    has_many :line_items, dependent: :destroy

    PAYMENT_TYPES = ["Check", "Credit Card", "Purchase order"]

    validates :name, :address, :email, presence: true
    validates :pay_type, inclusion: PAYMENT_TYPES

    def add_line_items_from_cart(cart)
        cart.line_items.each do |item|
            item.cart.id = nil
            line_items << item
        end
    end
end

在验证期间,如果我将订单的所有字段设置为空白,我会收到此错误(此输出来自服务器的控制台日志):

ActionView::Template::Error (No route matches {:action=>"show", :controller=>"carts", :id=>nil} missing required keys: [:id]):
11: </table>
12: 
13: <%= button_to 'Checkout', new_order_path, method: :get %>
14: <%= button_to 'Empty cart', cart, method: :delete,
15:     data: { confirm: 'Are you sure?' } %>

我似乎在验证期间错过了参数 :id。网络输出突出显示 字符串。

我不知道为什么应用程序丢失了这个参数。 所有的帮助和提示将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您的显示页面中似乎需要参数cart_id。你必须添加你的before_filter

    before_action :set_cart, only: [:show, :new, :create]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多