Rails ArgumentError в OrdersController # новая проверка

Второй вопрос здесь, я бы очень хотел решить его сам, но я просто не знаю, с чего начать его отлаживать.

Итак, вот моя ошибка в браузере (которая возникает, когда я иду, чтобы оформить заказ и ввожу свои данные в order/_form.html.erb)

ArgumentError в 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, которое находится здесь:

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_to payment_type и has_many line_items который belongs_to тележка.

Между прочим, я также пытаюсь hide_checkout_button использовать переменную экземпляра, когда нахожусь на странице заказа.

Таблица Orders имеет внешний ключ для таблицы PaymentTypes, и я пытаюсь найти правильный идентификатор из этой таблицы PaymentTypes для payment_type, отправленного пользователем.

Если я прокомментирую эти две строки:

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

Иногда я получаю другую ошибку:

NoMethodError в OrdersController#new

неопределенный метод `ключ?' для нуля: 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

И тогда у вас есть другая сторона этого belongs_to в payment_type.rb

class PaymentType < ActiveRecord::Base
  attr_accessible :pay_type

  has_many :orders

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

Я знаю, что я просто все путаю, но у меня есть один сбой в функциональных тестах и ​​одна ошибка, которая как-то связана с обновлением заказа, но я пока не знаю, что. Я собираюсь поработать над ними, чтобы увидеть, решу ли я случайно эту странную ошибку.

Если кто-нибудь может дать мне советы по взлому и отладке в рельсах, это было бы здорово. Я хотел бы иметь возможность решить это, не вводя все это здесь.

Я не думаю, что в этом случае трассировка сервера дает больше информации, чем окно браузера, но если вам это нужно или что-то еще, пожалуйста, спросите.

ОБНОВИТЬ:

Итак, моя проблема в том, что я знаю, как решить ее с помощью глобальной переменной в payment_type.rb, но это означает, что у меня есть один столбец с типами платежей в таблице Orders и другой столбец с именами и payment_type_id в другом столбце, который является внешним ключом. .

Поскольку у меня есть внешний ключ, мне не нужен отдельный столбец для payment_types в таблице Orders. Я должен просто увидеть значение из таблицы PaymentType в представлении Orders.

Как это сделать без глобальной переменной?

ОБНОВЛЕНИЕ двойки:

Итак, я никогда не публиковал это раньше (из 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">

Поэтому я попытался выбрать :pay_type в Orders, но дал варианты из :pay_type в PaymentTypes.

Я не могу себе представить, что имеет значение, не так ли? Кажется, в этом и заключается моя проблема, но не уверен.


person Endlessly Manipulable    schedule 14.11.2012    source источник
comment
app/models/payment_type.rb:6:in <class:PaymentType>' означает, что ошибка возникла впервые здесь, так что можете ли вы добавить свою модель PaymentType в свой пост, пожалуйста?   -  person MrYoshiji    schedule 14.11.2012
comment
Также я не уверен, что у вас может быть действие new в контроллере, это может быть зарезервированное слово.   -  person MrYoshiji    schedule 14.11.2012
comment
пожалуйста, покажите свои payment_type.rb и order.rb   -  person Thanh    schedule 14.11.2012
comment
Спасибо за быстрый ответ, ребята, есть идеи?   -  person Endlessly Manipulable    schedule 14.11.2012
comment
хорошо, ошибки, потому что вы не устанавливаете проверки для атрибутов в PaymenType, какой атрибут вы хотите, чтобы он был уникальным?   -  person Thanh    schedule 14.11.2012
comment
О, я такой мудак, я только что увидел валидации :uniqueness. Я думаю, я учился весь день и стал немного невежественным. Разве я не похож на инструмент...   -  person Endlessly Manipulable    schedule 14.11.2012
comment
Я думаю, ты хочешь: validates :pay_type_id, :uniqueness => true   -  person Thanh    schedule 14.11.2012
comment
Cheers Kien, но, что удивительно, он все еще не работает, я получаю ту же ошибку, что и раньше.   -  person Endlessly Manipulable    schedule 14.11.2012
comment
измените свой validates :pay_type... как ответ @Paulo, это тоже неправильно.   -  person Thanh    schedule 14.11.2012
comment
Я знаю, что что-то не так с массивом PAYMENT_TYPES, но не могу понять...   -  person Endlessly Manipulable    schedule 14.11.2012
comment
попробуйте запустить в консоли PAYMENT_TYPES = PaymentType.pluck(:pay_type), чтобы увидеть, что она возвращает   -  person Thanh    schedule 14.11.2012
comment
почему у вас :pay_type в Order.rb?   -  person Thanh    schedule 14.11.2012
comment
Та же ошибка, что и в браузере. Это строка, вызывающая проблемы, но посмотрите на документы, она просто создает массив из записей в столбце. А раньше у меня была константа массива, которая работала нормально...   -  person Endlessly Manipulable    schedule 14.11.2012
comment
убери :pay_type из Order.rb и замени @order.pay_type на @order.payment_type_id.pay_type   -  person Thanh    schedule 14.11.2012
comment
Вот и все, у меня не должно было быть PAYMENT_TYPES в order.rb. Он у меня там, потому что там он был как константа массива, что не вызывало никаких проблем. Я сделал это глобальной переменной и поместил в payment_type.rb.   -  person Endlessly Manipulable    schedule 14.11.2012
comment
Так ты решил свою проблему?   -  person Thanh    schedule 14.11.2012
comment
Обновлю пост :-)   -  person Endlessly Manipulable    schedule 14.11.2012
comment
Обновлено внизу, ура Киен :-)   -  person Endlessly Manipulable    schedule 14.11.2012
comment
Я не понимаю, что вы хотите сделать сейчас :(   -  person Thanh    schedule 14.11.2012
comment
если вы хотите отобразить все типы платежей в новом представлении заказа, попробуйте использовать этот код в своей форме: <%= f.select :payment_type_id, PaymentType.all, :id, :pay_type %>   -  person Thanh    schedule 14.11.2012
comment
Я борюсь здесь. Я обновил код (выделен полужирным шрифтом), чтобы показать вам, что я сделал, но я получаю исключение, аналогичное последнему, за исключением того, что на этот раз оно находится только в строке 7 order.rb. Киен, можете ли вы объяснить свой ответ? пожалуйста? Я действительно могу понять это. Вы имеете в виду изменить @order.pay_type на @order.payment_type_id.pay_type в OrdersController#create?   -  person Endlessly Manipulable    schedule 15.11.2012
comment
Спасибо за последнее сообщение, Киен :-)   -  person Endlessly Manipulable    schedule 15.11.2012
comment
да, в этом: ['pay_type = ?', @order.pay_type], ваш @order не имеет атрибута или метода с именем pay_type, поэтому он имеет ошибку NoMethodError   -  person Thanh    schedule 15.11.2012
comment
еще один, это также может использоваться для создания выбора в представлениях: <%= f.collection_select :payment_type_id, PaymentType.all, :id , :pay_type %>   -  person Thanh    schedule 15.11.2012
comment
О, но это то, что я имею в виду, когда два столбца, по одному в каждой таблице, делают одно и то же. Orders и PaymentTypes имеют столбцы с именем pay_type. Я хочу избавиться от pay_type в Orders, потому что это беспорядочно, поэтому я попробую ваш код, чтобы сделать это, спасибо. Но у @order есть вызов метода .pay_type. Я медлю не потому, что нужен перерыв на обед. Спасибо за попытку :-)   -  person Endlessly Manipulable    schedule 15.11.2012


Ответы (1)


Я думаю, что синтаксис вашего подтверждения включения неверен. Это должно быть что-то вроде:

проверяет :pay_type, :inclusion => { :in => PAYMENT_TYPES }

person Paulo Henrique    schedule 14.11.2012
comment
Ура, Пауло, похоже, ничего не делает. - person Endlessly Manipulable; 14.11.2012