因此,假设我有两个: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的角度来看,它让我觉得很脏。也许我错了。想法?
答案 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