совет для спокойного дизайна? - PullRequest
2 голосов
/ 18 августа 2011

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

Фон в приложении:

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. Поэтому я решил спросить, что вы, ребята, думаете о подобных вещах?

1 Ответ

0 голосов
/ 19 августа 2011

Я думаю, вы немного запутались: здесь два пользователя. Там есть пользователь, чьи данные нужно изменить, а затем есть пользователь, который вносит реальные изменения. Обычно они могут быть одинаковыми, но не всегда, например: администратору может потребоваться сбросить пароль какого-либо пользователя.

Идентификатор изменяемой пользовательской записи - это то, что должно войти в интерфейс REST, и User.find params[:id] должно позаботиться об этом просто отлично.

Пользователь, выполняющий изменение, имеет отношение к аутентификации (гарантирующей, что этот пользователь является тем, кем, как она утверждает, что он является) и авторизации (разрешено ли это использование для внесения этого изменения?). Это пользователь, которого вы получаете при звонке current_user. Драгоценные камни как devise помогают с этим.

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

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