RESTful отношения habtm в Rails - PullRequest
2 голосов
/ 29 января 2012

Итак, скажем, у меня есть две :has_and_belongs_to_many модели, которые объединены простой индексной таблицей.Вот как выглядит мой routs.rb:

match "foo/:id" => "foos#create", :via => :post
match "foo/:id" => "foos#update", :via => :put
match "foo/:id" => "foos#read", :via => :get
match "foo/:id" => "foos#delete", :via => :delete

match "foos/:id/bars" => "foos#add_bar", :via => :post

И последний маршрут (рассматриваемый) отображается в метод add_bar в файле foo_controller.rb, который ожидает JSON-представление панели:

def add_bar
  @bar = Bar.find(params[:bar][:id])
  if @bar.nil?
    @bar = Bar.create(params[:bar])
    validation_error(@bar.errors) unless @bar.valid?
    @bar.save!
  end
  @foo.bars << @bar
  @foo.save!
  respond(ResponseCode::OK, @bar)
end  

Имеет ли это смысл?Я соответствую поведению проталкивания к коллекциям в рельсах, но мне это кажется грязным с точки зрения RESTful.Может я не прав.Мысли?

1 Ответ

4 голосов
/ 29 января 2012

Поцарапайте все это и используйте:

resources :foos do
  member do
    post 'bars', :to => "foos#add_bar", :as => :add_bar_to
  end
end

Это дает вам шесть основных маршрутов RESTful CRUD, а также вспомогательный метод add_bar_to_foo. Ваш контроллер foos должен иметь метод show вместо read. Это соглашение Rails.

Для обработки добавления баров,

def add_bar
  @foo = Foo.find(params[:id]) # find the foo
  @bar = @foo.bars.build(params[:bar]) # build new bar through foo
  if @bar.save
    render :json => @bar # 'OK' response
  else
    render :json => @bar, :status => :unprocessable_entity # failure response
  end
end  
...