Одна модель и множество редактируемых видов - PullRequest
1 голос
/ 23 декабря 2010

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

У меня не было проблем с созданием маршрутизации, контроллера и представлений: я добавил представления edit_profile и update_profile, и я добавил на rout.rb строку:

map.resources :users ,:member => {:edit_profile => :get, :update_profile => :put}

Проблема в том, что когда я отправляю форму в edit_profile, и в некоторых полях ввода возникает ошибка, рельсы перезагружают страницу edit_path вместо страницы edit_profile_path! Это форма на edit_profile.html.erb

  form_for(:user, @user, :url => {:action => :update_profile}, :html => { :method => :put}  ) do |f|

    f.text_field :description
    f.text_area :description
    f.error_message_on :description

    ....
    ....

    f.submit 'Update profile'

После нажатия кнопки «Обновить профиль» при возникновении ошибок ввода я хочу показать представление edit_profile вместо представления редактирования

Где проблема? Есть предложения ? большое спасибо

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

Добавление дополнительных действий к контроллеру RESTful часто является запахом кода, что свидетельствует о том, что есть лучший способ смоделировать то, что вы пытаетесь сделать.В этом случае профиль действительно является подресурсом пользователя:

map.resources :users, :has_one => :profile

, что делает ваши профили маршрутов такими, как

GET /users/1/profile # show
GET /users/1/profile/edit #edit
PUT /users/1/profile # update
DELETE /users/1/profile #destroy

У вас будет отдельный ProfilesController для этих действий ... многоcleaner.

Как вы моделируете данные, зависит от вас (вам не нужно иметь взаимно-однозначное соотношение между вашими моделями и вашими контроллерами!), но в этом случае я бы, вероятно,используйте агрегаты ActiveRecord для моделирования отношений между пользователем и профилем.Думайте об этом как о встроенном has_one: http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html

Обратите внимание, что добавление дополнительных действий к контроллерам RESTful не всегда "неправильно" ... вам решать, когда уместно отделить новые действияв отдельный ресурс.В этом случае, однако, я думаю, что это очень четко!

1 голос
/ 23 декабря 2010

Действие вашего контроллера (я полагаю, действие edit) должно знать, достигнуто ли оно через обычную страницу edit или страницу edit_profile.Вы можете использовать скрытое поле с именем, возможно, profile, чтобы разместить крошку, которая скажет ему об этом.Делая это, вы можете условно перенаправить на основе наличия profile параметра.

Более чистым способом является создание нового действия с именем edit_profile и извлечение кода редактирования в общий метод, который называетсяиз обоих edit и edit_profile пусть открытые методы обрабатывают любые перенаправления.

1 голос
/ 23 декабря 2010

Взгляните на метод обновления файла user_controller.Вот куда отправляет форму редактирования.Там вы увидите, что если запись не может быть обновлена, она перенаправляется обратно к методу редактирования.

Один из способов сделать то, что вы хотите - это заставить вашу форму edit_profile указывать на новый метод, возможно, называемыйupdate_profile, который аналогичен методу edit, но перенаправляет на edit_profile, когда запись не может быть сохранена.

Возможно, лучший и более сухой способ сделать это - передать параметр из формы edit_profile.что вы можете обнаружить в вашем существующем методе обновления, чтобы различать попытки обновления из edit / edit_profile.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...