2010-05-28 60 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