未定义的局部变量或方法`current_submission'用于#<orderscontroller:0x000000056a6a30> </orderscontroller:0x000000056a6a30>

时间:2011-10-02 17:39:15

标签: ruby-on-rails ruby-on-rails-3

我正在尝试创建一个用于管理学术会议的应用程序。用户将登录并提交摘要,以便考虑在我们的年会上展示。对于我所做的大部分工作,我都遵循了“Ruby on Rails 3 Tutorial”。我的修改包括添加提交模型,注册模型和订单模型。提交模型属于User模型和has_one顺序。

我正在尝试使用有关使用ActiveMerchant集成PayPal Express结帐的Railscast 145/146集。我的目标是在提交的show.html.erb页面上放置一个PayPal结账按钮,以便在作者提交摘要后他可以立即支付提交费用。

在我提交订单后,以下代码出现错误:

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

据我所读,我认为问题与订单与提交的关系有关。每个提交都应该有一个相关的订单条目,因此在Order表中应该有一个submission_id。我真的很困惑这是如何工作的。

有人可以指出我正确的方向吗?是否有您推荐我阅读的用户指南?在不同版本的Rails之间似乎存在很多冲突的信息。我正在使用Rails 3.0.10。

谢谢!

1 个答案:

答案 0 :(得分:2)

您应该将资源设置为

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。关于你的评论

  

提交模型属于用户模型且has_one顺序。

在这种情况下,您需要将上述内容更改为 - 注意订单如何变为订单:

@order = @submission.order.build_order(params[:order])

所以你的关系是提交has_one:order;订单:belongs_to:提交和用户:has_one:提交?

<强>更新

根据您的描述描述您的要求,您的关系需要更改如下:

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只能在任何记录中出现一次。您可以像以前一样使用“订单”来设置您的控制器,它很可能是@submission = Submission.find(params[:id])而不是@submission = Submission.find(params[:submission_id]),因为订单是一种独特的资源。

如果您需要进一步的帮助,请发送电子邮件至ms at bsodmike dot com。