Второй вопрос здесь, я бы очень хотел решить его сам, но я просто не знаю, с чего начать его отлаживать.
Итак, вот моя ошибка в браузере (которая возникает, когда я иду, чтобы оформить заказ и ввожу свои данные в 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.
Я не могу себе представить, что имеет значение, не так ли? Кажется, в этом и заключается моя проблема, но не уверен.
app/models/payment_type.rb:6:in <class:PaymentType>'
означает, что ошибка возникла впервые здесь, так что можете ли вы добавить свою модель PaymentType в свой пост, пожалуйста? - person MrYoshiji   schedule 14.11.2012new
в контроллере, это может быть зарезервированное слово. - person MrYoshiji   schedule 14.11.2012payment_type.rb
иorder.rb
- person Thanh   schedule 14.11.2012validates :pay_type_id, :uniqueness => true
- person Thanh   schedule 14.11.2012validates :pay_type...
как ответ @Paulo, это тоже неправильно. - person Thanh   schedule 14.11.2012PAYMENT_TYPES = PaymentType.pluck(:pay_type)
, чтобы увидеть, что она возвращает - person Thanh   schedule 14.11.2012:pay_type
вOrder.rb
? - person Thanh   schedule 14.11.2012:pay_type
изOrder.rb
и замени@order.pay_type
на@order.payment_type_id.pay_type
- person Thanh   schedule 14.11.2012<%= f.select :payment_type_id, PaymentType.all, :id, :pay_type %>
- person Thanh   schedule 14.11.2012['pay_type = ?', @order.pay_type]
, ваш @order не имеет атрибута или метода с именем pay_type, поэтому он имеет ошибкуNoMethodError
- person Thanh   schedule 15.11.2012<%= f.collection_select :payment_type_id, PaymentType.all, :id , :pay_type %>
- person Thanh   schedule 15.11.2012