Много-много ассоциаций и ОТДЫХА? - PullRequest
1 голос
/ 24 сентября 2011

Вопрос новичка, вы были предупреждены!

Я пытаюсь реализовать пример приложения Rails с ассоциацией «многие ко многим», люди, владеющие фильмами, и я пытаюсь выяснить, какименно для реализации интерфейса для него.Я понимаю, что REST требует, чтобы все было ресурсом, поэтому в данном случае «Пользователь» (персона), «Кино» и «Владение» (объединенная таблица) (о, каламбур).

Теперьинтересная часть, UX.Допустим, у меня есть панель пользователя, где перечислены все ваши фильмы.

Допустим, пользователь хочет добавить фильм, который ему принадлежит.Как вы делаете это в REST?Это тривиально с настраиваемым действием, которое можно добавить к пользовательскому контроллеру, но смысл не в том, чтобы выходить за рамки основных 7 действий REST, верно?Поэтому я должен сначала сделать «новое» в фильме, а затем сделать «новое» для владения, что является двумя операциями.Как мне свести их в одну?

По сути, я чувствую, что не совсем понимаю, как поддерживать REST, как только участвуют несколько моделей, и хотел бы получить совет.

Спасибо!

1 Ответ

1 голос
/ 24 сентября 2011

К счастью, в 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.

...