Неопределенная локальная переменная или метод `current_submission’ для #

#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 не делает это за вас.