【问题标题】:Rails ArgumentError in OrdersController#new validationOrdersController 中的 Rails ArgumentError#new 验证
【发布时间】:2012-11-14 18:35:03
【问题描述】:

这里的第二个问题,我真的很想自己解决这个问题,但我不知道从哪里开始调试它。

所以这是我在浏览器中的错误(当我去结帐并按顺序输入我的详细信息时发生)/_form.html.erb

OrdersController 中的参数错误#new

您需要提供至少一项验证

Rails.root: C:/Users/Ruby/rails_practice/depot4 应用程序跟踪 |框架跟踪 |全程跟踪

app/models/payment_type.rb:6:in <class:PaymentType>' app/models/payment_type.rb:1:in' app/models/order.rb:7:in <class:Order>' app/models/order.rb:1:in' app/controllers/orders_controller.rb:1:in `'

这是我在 OrdersController 中的新定义:

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

  @hide_checkout_button = true
  @order = Order.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @order }
  end
end

问题是我没有接触def new,我一直在做def create,这里是:

def create
  @order = Order.new(params[:order])
  @order.add_line_items_from_cart(current_cart)
  @cart = current_cart
  @hide_checkout_button = true
  pay_type = PaymentType.find( :conditions => ['pay_type = ?', @order.pay_type] )
  @order.payment_type_id = pay_type.id

  respond_to do |format|
    if @order.save
      Cart.destroy(session[:cart_id])
      session[:cart_id] = nil
      format.html { redirect_to(store_url, :notice => 'Thank you for your order.') }
      format.json { render json: @order, status: :created, location: @order }
    else
      format.html { render action: "new" }
      format.json { render json: @order.errors, status: :unprocessable_entity }
    end
  end
end

我要做的是创建一个订单,即 belongs_topayment_typehas_many line_items belongs_to 购物车。

顺便说一句,当我在订单页面上时,我也在尝试使用实例变量 hide_checkout_button

Orders 表有一个指向PaymentTypes 表的外键,我正在尝试从该PaymentTypes 表中为用户提交的payment_type 找到正确的ID。

如果我注释掉这两行:

pay_type = PaymentType.find( :conditions => ['pay_type = ?', @order.pay_type] )
@order.payment_type_id = pay_type.id

有时我会收到不同的错误:

OrdersController 中的 NoMethodError#new

未定义的方法`key?'对于 nil:NilClass

我认为这与浏览器中的缓存不正确有关,但我不确定连接是什么。

我会在第一次发布后更新其余部分


二重奏

我知道这是关于验证,但我看不出我做错了什么... order.rb:

class Order < ActiveRecord::Base
  attr_accessible :address, :email, :name, :pay_type, :payment_type_id, :cart_id, 
  :product_id

  has_many :line_items, :dependent => :destroy
  belongs_to :payment_type

  PAYMENT_TYPES = PaymentType.pluck(:pay_type)

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

然后你在payment_type.rb 中得到了belongs_to 的另一面

class PaymentType < ActiveRecord::Base
  attr_accessible :pay_type

  has_many :orders

  validates ***:pay_type,*** :uniqueness
end

我知道我完全只是混淆了一些事情,但我在功能测试中有一个失败,还有一个与更新订单有关的错误,但我还不知道是什么。我将研究它们,看看是否通过解决它们我无意中解决了这个奇怪的错误。

如果有人能给我有关在 Rails 中进行黑客攻击和调试的提示,那就太好了。我希望能够在不在这里输入所有内容的情况下解决这个问题。

在这种情况下,我认为服务器跟踪不会提供比浏览器窗口更多的信息,但如果您需要它,或者有什么其他问题,请询问。

更新:

所以我的问题是我知道如何使用 payment_type.rb 中的全局变量来解决它,但这意味着我在 Orders 表中有一个支付类型列,在另一列中有另一个名称和 payment_type_ids,即外键。

由于我有外键,因此我不需要 Orders 表中的 payment_types 列。我应该能够在 Orders 视图中看到 PaymentType 表中的值。

如果没有全局变量,你如何做到这一点?

更新双人:

好的,所以我以前从未发布过这个(来自 orders_form.html.erb):

26:   <div class="field">
27:     <%= f.label :pay_type %><br />
28:     <%= f.select :pay_type, PaymentType::PAYMENT_TYPES,
29:                      :prompt => 'Select a payment method' %>
30:   </div>
31:   <div class="actions">

所以我尝试在 Orders 中选择 :pay_type,但在 PaymentTypes 中给出了 :pay_type 的选项。

我无法想象这很重要吗?似乎是我的问题所在,但不能确定。

【问题讨论】:

  • app/models/payment_type.rb:6:in &lt;class:PaymentType&gt;' 表示错误首先在这里提出,所以您可以将您的 PaymentType 模型添加到您的帖子中吗?
  • 我也不确定您是否可以在控制器中使用new 操作,它可能是保留字。
  • 请出示您的payment_type.rborder.rb
  • 为快速响应的家伙干杯,有什么想法吗?
  • 好的,错误是因为您没有设置验证 PaymenType 中的属性,您希望哪个属性是唯一的?

标签: ruby-on-rails arrays validation nomethoderror


【解决方案1】:

我认为您的 validate 包含的语法是错误的。它应该是这样的:

验证 :pay_type, :inclusion => { :in => PAYMENT_TYPES }

【讨论】:

  • 干杯保罗,但似乎什么也没做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多