2010-05-28 7 views
0

J'ai un problème en essayant de sauvegarder dans une table intermédiaire. Je suis nouveau sur Rails et j'ai passé quelques heures sur ce sujet, mais je n'arrive pas à le faire fonctionner, peut-être que je fais tout le mal. Toute aide serait appréciée. =)Comment insérer des lignes dans une relation plusieurs-à-plusieurs

L'application est un magasin de livres simple, où un utilisateur connecté choisit des livres et ensuite créer une commande.

Cette erreur s'affiche:

NameError in OrderController#create 
uninitialized constant Order::Orderlist 


Ce sont mes modèles:

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 


Ceci est mon contrôleur de commande:

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 à l'avance!
Manuel

+0

Il y a aussi 'has_and_belongs_to_many' dans Rails qui est ce qu'il vous ressemble vraiment ici. – x1a4

+0

Cela dépend - si OrderList a une logique réelle, alors il est logique de le faire de cette façon. J'ai moi-même un 'Game <-> Player <-> Configuration de l'utilisateur qui fonctionne exactement comme ça. – Chowlett

Répondre

2

seulement eu le temps de regarder brièvement, j'ai peur, mais la première chose que je place est que vos has_many relations sont appelées :orderlists. Je pense que cela doit être :order_lists, avec un trait de soulignement.

+0

Je pense que Chris est juste ici. La convention est que les mots CamelCased deviennent: camel_cased lorsqu'il est transformé en symbole. –

0

Oui c'était l'un des problèmes. Ensuite, je pourrais le faire fonctionner avec cette ligne dans le « créer » méthode:

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 

Merci Chris

1

Ce n'est pas directement associé à votre question, mais cette requête:

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

... est vulnérable à l'injection sql. Dans ce cas, le contenu de params [: id] est passé à sql sans s'échapper correctement. Je suggère de changer cette ligne à quelque chose comme ceci:

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

est ici explication: http://wiki.rubyonrails.org/howtos/security/sql_injection

+0

Thnx Uģis. Bon à savoir! :RÉ – GSound

Questions connexes