2015-03-12 3 views
1

Работа через Rails Tutorial 3rd Edition Майкл Hartl: Ch 8 Войдите, ВыйтиИспользование переменных экземпляра в контроллерах

мне нужна помощь, чтобы понять, почему в session_controller мы используем регулярную переменную «пользователя» в то время как в user_controller мы используем переменную экземпляра «@user».

я заметил, что в session_controller, мы используем

def create 
    user = User.find_by... 

, тогда как в users_controller, мы используем

def create 
    @user = User.new... 

Майкл утверждает, «Основное различие между формой сеанса и формой регистрации является что у нас нет модели сеанса и, следовательно, нет аналога для переменной @user ... », обращаясь к этому:

form_for(@user) 

от пользователей просмотра по сравнению с

form_for(:session, url: login_path) 

с точки зрения сеанса.

Это связано? Я до сих пор не понимаю этого. Пожалуйста, дайте мне знать, если мне нужно быть более ясным или конкретным. Спасибо!

ответ

0
def create 
    user = User.find_by... 

В этом случае user является локальной переменной. Он используется только одним и тем же способом.

def create 
    @user = User.new... 

Здесь @user является переменным экземпляром, прикрепленный к UsersController, и сделав его переменный экземпляр, он становится доступным в соответствующих представлениях.

Так что если вы посмотрите на любые виды, относящиеся к пользователям под app/views/users, будет ссылка на @user. Ничего подобных родов не делается в представлениях, связанные с сессиями (т.е. просматривать файлы под app/views/sessions папку)

0

Переменные пользователя и @user имеют различную область применения

пользовательские переменную доступна между словами Защитой конца

def create 
    user = User.new 
    print user 
end 
create 
print user 
NameError: undefined local variable ... 

вы не можете использовать пользовательскую переменную вне блока определения метода, но если вы используете переменную как @user вы можете

def create 
    @user = User.new 
    print @user 
end 
create 
print @user 
#<User:0x007fe1d25596d0>=> nil 

S o В представлениях может использоваться только переменная @user. Автор использует локального пользователя переменной в session_controller, потому что нет необходимости использовать эту переменную в представлении, и он использует @user для users_controller, потому что если проверка пользователя не удалась, она будет отображать форму form_for (@user) со значениями, введенными пользователем перед отправкой. Поэтому пользователю не нужно заполнять все поля формы снова, ему нужно только исправить только неправильные поля

0

Я все еще не понимаю этого. Пожалуйста, дайте мне знать, если мне нужно быть более ясным или конкретным.

Давайте попробуем понять, как все эти вещи работают:

В users_controller, вы инстанцирование пустого объекта пользователя по @user = User.new, который вы будете использовать в вашей регистрационной форме. Причина этого заключается в том, что если вы создаете экземпляр нового объекта и передаете этот объект в качестве аргумента в форме, рельсы автоматически вызывают метод create users_controller. Все будет сделано из-за маршрута ресурса Rails Rails.

Во #create,

<%= form_for(@user) do |f| %> 
    ... 
<% end %> 

эквивалентен:

<%= form_for @user, as: :user, url: users_path, html: { class: "new_user", id: "new_user" } do |f| %> 
    ... 
<% end %> 

С другой стороны, если вы инстанцируете старую запись как @user = User.find(...), рельсы будут называть #update метод users_controller при отправке форма.

Во #update,

<%= form_for @user do |f| %> 
    ... 
<% end %> 

эквивалентно:

<%= form_for @user, as: :user, url: user_path(@user), method: :patch, html: { class: "edit_user", id: "edit_user_1" } do |f| %> 
    ... 
<% end %> 

Итак, теперь, почему переменная экземпляра не используется в sessions_controller#create действия? Хорошо, если вы создаете объект @user и используете его в форме входа в систему, как то, что вы сделали в регистрационной форме, оно назовет #create действие users_controller вместо #create действие sessions_controller.

Именно поэтому в форме входа используется form_for(:session, url: login_path). Вы получите Hash с ключом :session, поскольку с момента отправки URL-адреса явно указано, то есть login_path, информация для входа будет отправлена ​​в #create действию sessions_controller.

Надеюсь, теперь все имеет смысл.

+0

_ «Итак, теперь почему переменная экземпляра не используется в session_controller #create action? Хорошо, если вы создаете экземпляр объекта @user и используете его в форме входа в систему, как то, что вы сделали в регистрационной форме, оно вызовет #create действие users_controller вместо #create действия session_controller. "_ – user1486510

+0

Вы говорите, что переменная экземпляра @user, определенная в UserController, доступна в формах вне представлений/users /? – user1486510

Смежные вопросы