#ruby-on-rails #ruby-on-rails-3
#ruby-on-rails #ruby-on-rails-3
Вопрос:
Я пытаюсь создать приложение для управления академической конференцией. Пользователи будут входить в систему и отправлять тезисы для рассмотрения на нашей ежегодной конференции. Я следовал «Ruby on Rails 3 Tutorial» для большей части того, что я сделал. Мои изменения включают добавление модели отправки, модели регистрации и модели заказа. Модель отправки принадлежит модели пользователя и имеет один порядок.
Я пытаюсь следить за эпизодами Railscast 145/146 об интеграции PayPal Express checkout с использованием ActiveMerchant. Моя цель — разместить кнопку оформления заказа PayPal на странице представления show.html.erb, чтобы после того, как автор отправил свой реферат, он мог сразу оплатить сбор за отправку.
Ошибка возникает из следующего кода после отправки заказа:
class OrdersController < InheritedResources::Base
def new
@order = Order.new
end
def create
@order = current_submission.orders.build_order(params[:order])
@order.ip_address = request.remote_ip
if @order.save
# flash[:notice] = "Successfully created order."
#redirect_to orders_url
else
render :action => 'new'
end
end
end
Из того, что я прочитал, я думаю, что проблема связана с тем, как заказы связаны с отправками. Каждая отправка должна иметь связанную запись заказа, поэтому в таблице заказов должен быть submission_id . Я действительно смущен тем, как это работает.
Не мог бы кто-нибудь указать мне правильное направление? Есть ли руководство пользователя, которое вы бы порекомендовали мне прочитать? Кажется, существует много противоречивой информации между различными версиями Rails. Я использую Rails 3.0.10.
Спасибо!
Комментарии:
1. Нет контекста для
current_submission
; как вы настроили свои ресурсы? Я также не уверен в связи с пользовательским порядком ‘has_one’.2. Мой файл routes.rb содержит: ресурсы: представления Я понимаю, что представления — множественное число. Я думал, что ресурсы указывают на контроллер, а не на модель.
3. Не забудьте обновить свои модельные отношения, что-то не так, как в ваших предыдущих комментариях.
4. Итак, пользователь регистрируется и отправляет несколько тезисов за один раз, следовательно, ему разрешен только один заказ?
5. Пользователи регистрируются и могут отправлять более одной отправки. Каждая отправка представляет собой отдельный реферат. Каждый раз, когда они отправляют отправку, они должны платить сбор за отправку. Плата за отправку будет вычтена из регистрационных сборов позже. (Плата за подачу не подлежит возврату, в то время как регистрационные сборы могут быть возвращены, если автор не поедет на конференцию.)
Ответ №1:
Вы должны настроить свои ресурсы как
resources :submissions do
resource :order
end
Таким образом, ваши параметры будут отражать конкретное представление, доступ к которому осуществляется через :id
атрибут. Затем ваше orders#create
действие изменится на
@submission = Submission.find(params[:submission_id])
@order = @submission.orders.build_order(params[:order])
Кажется, что отношение, которое вы отразили выше, указывает Submission has_many :orders
. Что касается вашего комментария
Модель отправки принадлежит модели пользователя и имеет один порядок.
В этом случае вам нужно изменить приведенное выше — обратите внимание, как orders становится order:
@order = @submission.order.build_order(params[:order])
Итак, ваши отношения — Submission has_one :order; Order :belongs_to :submission и User : has_one :submission?
Обновить
Основываясь на ваших комментариях, описывающих ваши требования, ваши отношения должны измениться следующим образом:
class User < ActiveRecord::Base
has_many :orders
has_many :submissions, :through => :orders
class Order < ActiveRecord::Base
# this table needs attributes user_id and session_id
belongs_to :user
belongs_to :session
validates :submission_id, :uniqueness => true
class Submission < ActiveRecord::Base
has_many :orders
has_many :users, :through => :orders
Поскольку я установил ограничение уникальности для таблицы соединений, это гарантирует, что конкретная submission_id
запись может встречаться только один раз в любой записи. Вы можете настроить свой контроллер, используя ‘orders’, как и раньше, и, скорее всего, это будет @submission = Submission.find(params[:id])
, а не @submission = Submission.find(params[:submission_id])
, поскольку orders — это отдельный ресурс.
Если вам нужна дополнительная помощь в этом, напишите мне по электронной почте Майку на bsodmike dot com.
Комментарии:
1. Спасибо за ваш ответ. Я внес предложенные вами изменения, попробовав как order, так и orders . Теперь я получаю сообщение об ошибке «нет совпадений маршрута / заказов». Я добавил resource :orders в файл routes.db, и, похоже, он работает. Еще раз спасибо за щедрую помощь.
2. Нет, теперь он выдает мне ошибку «Не удалось найти отправку без идентификатора»
3. Проверьте хэш параметров, следует ли использовать
:id
: или:submission_id
. Также убедитесь, что ваши миграции таблиц верны — для всехbelongs_to
таблиц требуется внешний ключ, который вам нужно создать, т. Е. Rails не делает это за вас.