В Ruby on Rails Restful Authentication используется UsersController#new, @user = User.new. Он действительно нужен?

После

script/generate authenticated user sessions

users_controller.rb создается с помощью

def new
  @user = User.new
end

и представление имеет эту строку:

@user.password = @user.password_confirmation = nil

и это все. Это на самом деле нужно? Я имею в виду, что форма будет отправлять POST в /users, что осуществляется маршрутизацией RESTful, переходя в UsersController#create, поэтому созданный @user фактически никогда не используется. Нужен ли он вообще и зачем? Благодарю.


Обновление: @user больше нигде больше не используется... кроме того, я попытался удалить эти две строки.

@user = User.new

и

@user.password = @user.password_confirmation = nil

и я все еще могу использовать форму для создания нового пользователя...


person nonopolarity    schedule 28.02.2011    source источник


Ответы (2)


В представлении это вроде как имеет смысл. Допустим, создание учетной записи пользователя не удалось - вы будете повторно отображать представление new с другим (не новым) объектом @user. Я бы, вероятно, сбросил пароль и пароль_подтверждение в действии.

person Andy Gaskell    schedule 28.02.2011
comment
хм... вы имеете в виду, скажем, если имя входа или адрес электронной почты уже были зарегистрированы, и они не пройдут проверку, и они не перейдут к контроллеру снова, а повторно отобразят представление... и мы не не хочу отображать представление с паролем, уже заполненным в форме... вот почему мы используем строку @user.password = @user.password_confirmation = nil для очистки пароля - исключительно для целей неудачной проверки... на самом деле, <% form_for :user, :url => users_path do |f| -%> предварительно заполнит форму используя другие значения... так что :user так же хорошо, как @user... - person nonopolarity; 01.03.2011
comment
похоже, что если @user не создан, то form_for создаст его... а если уже создан, то не будет создавать его... чтобы очистить поля пароля, его нужно создать в контроллере.. , если в представлении мы не говорим @user.password = @user.password_confirmation = nil if (defined? @user) && [email protected]? - person nonopolarity; 01.03.2011
comment
У вас в значительной степени это есть - я говорил, что при необходимости я бы очистил пароли в контроллере, а не в представлении. Из того, что вы видели, кажется, что @user не нужен для нового запроса new, однако @user будет использоваться при неудачном создании пользователя. Чтобы попробовать это, переименуйте @user во что-то другое в контроллере и посмотрите, как ваше представление ведет себя при неудачном создании учетной записи пользователя. - person Andy Gaskell; 01.03.2011
comment
если я удалю его в контроллере, тогда в представлении будет указано undefined method password_confirmation= for nil:NilClass, когда должна отображаться форма регистрации... но если у меня уже есть недопустимые поля, а затем переименовано в @user2 в контроллере, представление на самом деле отображается нормально... Если Я удаляю эту строку, которая устанавливает пароль равным нулю, тогда она имеет нежелательный эффект, заключающийся в том, что пароль не сбрасывается и находится в форме, которую можно просмотреть в исходном коде HTML... но... на самом деле форма отправляется в HTTP, так что в любом случае этот пароль можно просмотреть для любого сетевого перехватчика ... предварительное заполнение должно быть в порядке? - person nonopolarity; 01.03.2011

Это необходимо для отображения правильной формы при просмотре. Формы могут сказать, что это просто несохраненные объекты, как здесь, поэтому форма создаст почтовый запрос. Если это пользователь, который был найден в БД, то он автоматически создаст запрос PUT для обновления.

<%= form_for @user do |f| %>
  <%#= something %>  
<% end %> 

Он будет вести себя по-другому, если вы сделаете в своем контроллере User.new или User.find(id)

person m4risU    schedule 28.02.2011
comment
Он использует <% form_for :user, :url => users_path do |f| -%>... @user больше нигде больше не использовался... см. также обновление №1 в вопросе - person nonopolarity; 01.03.2011