Rails中的RESTful habtm关系

时间:2012-01-29 05:05:50

标签: ruby-on-rails rest has-and-belongs-to-many

因此,假设我有两个:has_and_belongs_to_many模型,它们由一个简单的索引表连接起来。这就是我的routes.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

最后一个路径(有问题的路径)映射到foo_controller.rb中的add_bar方法,该方法需要条形图的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  

这有意义吗?我匹配推送到rails中的集合的行为,但从RESTful的角度来看,它让我觉得很脏。也许我错了。想法?

1 个答案:

答案 0 :(得分:4)

抓住所有这些并使用:

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