У меня вопрос о том, как лучше структурировать спокойный дизайн для определенной части приложения, над которым я работаю.
Фон в приложении:
User has_one :settings_for_email
Существует profile_controller, который имеет действие show .. Что-то вроде:
def show
@user = current_user
end
Первоначально это было настроено так, чтобы форма отправляла обратно в контроллер профиля .. что-то вроде:
<% form_for profile_path(@user) do |f| %>
<% f.fields_for :settings_for_email do |s| %>
<% ... form fields ... %>
<% end %>
<% end %>
И действие обновления profile_controller сделало что-то вроде этого:
def update
@user = User.find(params[:id])
@user.settings_for_email.update_attributes(params[:user][:settings_for_email])
end
....
Мне это не понравилось, потому что у него есть уязвимость, позволяющая изменять редактируемую запись пользователя ... Изменение в @user = current_user не имело особого смысла для меня, потому что это действие по обновлению, требующее Идентификатор somekind .. Так что переход к / profile / 123 или profile / 456 даст ту же самую запись пользователя (поскольку она будет использовать current_user, params [: id] будет излишним) .. Это кажется мне странным.
В качестве примечания мне потребовалось действие контроллера, чтобы сбросить настройки электронной почты пользователя до значений по умолчанию.
Итак, в итоге я сделал новый маршрут:
resource :settings_for_email, :only => :create do
post :reset, :on => :member
end
и затем создание settings_for_email_controller:
#settings_for_email_controller.rb
def create
current_user.settings_for_email.update_attributes(params[:settings_for_email_controller])
redirect_to profile_url
end
def reset
current_user.reset_settings_for_email!
redirect_to profile_url
end
...
Но потом я удивился, можно ли это как-нибудь улучшить?
Если бы я действительно хотел сделать это на 100% спокойным, лучше было бы сделать:
#update_settings_for_email_controller:
def create
current_user.settings_for_email.update_attributes(params[:settings_for_email_controller])
redirect_to profile_url
end
#reset_settings_for_email_controller:
def create
current_user.reset_settings_for_email!
redirect_to profile_url
end
Я нахожусь на ограждении по этому поводу, потому что кажется немного глупым иметь два контроллера для этого ... Но я не мог придумать лучшего способа сделать это. Опять же, использование update требует идентификатора, и поэтому уничтожает Первоначально я думал, что было бы неплохо использовать действие уничтожения для выполнения «перезагрузки», но ... опять же ... это будет связано с потерянным параметром id. Поэтому я решил спросить, что вы, ребята, думаете о подобных вещах?