Как вставить строки в отношение многие ко многим - PullRequest
0 голосов
/ 28 мая 2010

У меня проблема с сохранением в промежуточную таблицу. Я новичок в 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

Спасибо заранее!
Manuel

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

Боюсь, у меня есть только время, чтобы взглянуть на это кратко, но первое, что я замечаю, это то, что ваши has_many отношения называются :orderlists. Я думаю, что это должно быть :order_lists, с подчеркиванием.

1 голос
/ 28 мая 2010

Это не связано напрямую с вашим вопросом, но этот запрос:

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 голосов
/ 28 мая 2010

Да, это была одна из проблем. Тогда я мог бы заставить его работать с этой строкой в ​​методе '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

Спасибо, Крис

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...