新手问题,你已被警告过了!
我正在尝试实现一个带有多对多关联的示例Rails应用程序,拥有电影的人,我正在试图弄清楚如何为它实现UI。我的理解是REST需要一切都是资源,所以在这种情况下“用户”(人),“电影”和“占有”(联合表)(哦,双关语)。
现在有趣的部分,UX。假设我有一个用户信息中心,其中列出了所有电影。
假设用户想要添加他拥有的电影。你如何在REST中做到这一点?可以添加到用户控制器的自定义操作是微不足道的,但重点不是超越基本的7个REST操作,对吧?因此,我必须首先在电影上做一个“新”,然后对一个拥有的“新”进行,这是两个操作。如何将它们合并为一个?
基本上我觉得我不太了解如何在涉及多个模型时立即维护REST,并希望获得提示。
谢谢!
答案 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
。