2010-05-28 63 views
0

我遇到试图保存到中间表的问题。我是Rails新手,我已经花了几个小时的时间,但不能使它工作,也许我做错了整个事情。任何帮助将不胜感激。 =)如何在多对多关系中插入行

该应用程序是一个简单的书店,登录用户选择书籍,然后创建订单。显示

此错误:

NameError in OrderController#create 
uninitialized constant Order::Orderlist 


这是我的模型:

class Book < ActiveRecord::Base 
    has_many :orderlists 
    has_many :orders, :through => :orderlists 
end 

class Order < ActiveRecord::Base 
    belongs_to :user 
    has_many :orderlists 
    has_many :books, :through => :orderlists 
end 

class OrderList < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :order 
end 


这是我的命令控制器:

class OrderController < ApplicationController 

    def add 
     if session[:user] 
      book = Book.find(:first, :conditions => ["id = #{params[:id]}"]) 
      if book 
       session[:list].push(book) 
      end 
      redirect_to :controller => "book" 
     else 
      redirect_to :controller => "user" 
     end 
    end 

    def create 
     if session[:user] 
      @order = Order.new 
      if @order.save 
       session[:list].each do |b| 
        @order.orderlists.create(:book => b) # <-- here is my prob I cant make it work 
       end 
      end 
     end 
     redirect_to :controller => "book" 
    end 
end 

日Thnx提前!
曼努埃尔

+0

还有'has_and_belongs_to_many' Rails中是什么样子你真的想在这里。 – x1a4 2010-05-28 17:07:26

+0

这取决于 - 如果OrderList具有实际的逻辑,那么这样做是有意义的。我自己有一个'游戏<->播放器<->用户设置,完全是这样的。 – Chowlett 2010-06-01 08:12:04

回答

2

只有有时间来看看这个简单,我很害怕,但我发现的第一件事情是,你的has_many关系被称为:orderlists。我认为这需要:order_lists,并带有下划线。

+0

我认为克里斯就在这里。惯例是CamelCased的词变成:camel_cased变成符号时。 – 2010-05-28 16:44:22

0

是的,这是问题之一。然后我可以使它与该行合作的“create”方法:这是不直接与你的问题相关的

def create 
    if session[:user] 
     @order = Order.new 
     if @order.save 
      session[:list].each do |b| 
       OrderList.create(:book => b, :order => @order) 
      end 
     end 
    end 
    redirect_to :controller => "book" 
end 

感谢克里斯

1

但此查询:

book = Book.find(:first, :conditions => ["id = #{params[:id]}"])

...很容易被sql注入。在这种情况下,params [:id]的内容被传递给sql,但没有正确转义。我会建议改变这一行是这样的:

book = Book.find(:first, :conditions => ["id = ?, params[:id]])

这里的解释:http://wiki.rubyonrails.org/howtos/security/sql_injection

+0

ThnxUģis。很高兴知道! :d – GSound 2010-05-28 19:48:27