多对多关联和REST?

时间:2011-09-24 06:39:40

标签: ruby-on-rails ruby-on-rails-3 rest

新手问题,你已被警告过了!

我正在尝试实现一个带有多对多关联的示例Rails应用程序,拥有电影的人,我正在试图弄清楚如何为它实现UI。我的理解是REST需要一切都是资源,所以在这种情况下“用户”(人),“电影”和“占有”(联合表)(哦,双关语)。

现在有趣的部分,UX。假设我有一个用户信息中心,其中列出了所有电影。

假设用户想要添加他拥有的电影。你如何在REST中做到这一点?可以添加到用户控制器的自定义操作是微不足道的,但重点不是超越基本的7个REST操作,对吧?因此,我必须首先在电影上做一个“新”,然后对一个拥有的“新”进行,这是两个操作。如何将它们合并为一个?

基本上我觉得我不太了解如何在涉及多个模型时立即维护REST,并希望获得提示。

谢谢!

1 个答案:

答案 0 :(得分:1)

令人高兴的是,Rails只为这种常见情况提供了一些魔力。假设这样的模型:

class Movie
  has_many :users, :through => :possessions
end

您的观点:

<%= form_for [current_user, Movie.new] do |f| %>
  <%= f.label       :title %>
  <%= f.text_field  :title %>
<% end %>

此表单基本上会POST发送到MoviesController#create,并会将current_user.id作为user_id参数传递(默认)MoviesController#create将知道与之关联它创建的Movie。有关详细信息,请查看FormBuilder#form_for的文档。

顺便说一下,你也可以这样做:

class User
  has_many :movies, :through => :possessions

  accepts_nested_attributes_for :movies # magic!
end

观点:

<%= form_for current_user |user_form| %>
  <%= user_form.fields_for current_user.movies.build |movie_fields| %>
    <%= movie_fields.label      :title %>
    <%= movie_fields.text_field :title %>
  <% end %>
<% end %>

在这种情况下,表单将提交给UsersController#update,其参数将如下所示:

{ :id => 123,
  :movie => {
    :title => "The Red Balloon"
  }
}

...并且控制器将知道创建Movie对象。有关更多信息,请查看FormHelper#fields_for

的文档