2012-01-29 63 views
2

假设我有两个:has_and_belongs_to_many模型通过简单的索引表连接起来。这是我的routes.rb是什么样子:Rails中的RESTful habtm关系

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映射到其预期酒吧的JSON表示的foo_controller.rb:

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的角度来看,我感觉很肮脏。也许我错了。思考?

回答

4

划痕这一切,用途:

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

这给你六个基本REST风格的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