Небольшое пояснение (form_for
документация здесь):
<%= form_for @user, :as => :user, :url => sign_in_path(@user) do |f| %>
Пункт 1. :as => :user
Это имя используется для генерации имени ввода (и имен параметров), например:
= form_for Admin.new, as: :user do |f|
#^^^^
= f.input :username
# will generate an input like this:
<input type='text' name='user[username]' #... />
#^^^^
Пункт 2. :url => sign_in_path(@user)
В учебнике @user
устанавливается следующим образом:
def sign_in
@user = User.new
end
Пункт 3. @user
доступен в других действиях
Вы должны установить эту переменную в каждом действии, которое вы хотите. Это может быть избыточным, поэтому вы можете использовать фильтр before_filter для аутентификации, устанавливая переменную @user
для каждого действия, которое вы хотите:
class UsersController < ApplicationController
before_filter :set_user_variable
def set_user_variable
@user ||= User.find(session[:user_id]) if session[:user_id].present?
end
end
Если вы хотите сделать его доступным везде в вашем приложении (подразумевается, что вы должны быть подключены к учетной записи пользователя для просмотра приложения):
class ApplicationController < ActionController::Base
before_filter :set_user_variable, except: [:sign_in, :login]
def set_user_variable
@user ||= User.find(session[:user_id]) if session[:user_id].present?
end
Пункт 4. form_for (User.new)
Мы устанавливаем переменную @user
в контроллере и передаем ее в качестве аргумента form_for
, потому что соглашение Rails никогда не вызывает имя модели непосредственно в представлениях, и не рекомендуется провоцировать SQL-запросы в представлении.
Пример:
######## WRONG
# view
<%= Post.find(params[:id]).title %>
######## MUCH BETTER
# controller's action:
def show
@post = Post.find(params[:id])
# view
<%= @post.title %>
Переменные экземпляра, установленные в действии контроллера, распространяются между действиями, его представлением и его частичными представлениями.
Пункт 5. блок do/end в form_for
Пожалуйста, выскажите свое мнение на этом этапе, не знаю, как это объяснить
Эта часть кода называется блоком do/end, она представляет собой фрагмент кода, который будет выполняться в контексте form_for
. Мы используем экземпляр form_for
в качестве переменной, определенной в каналах, здесь это |f|
. Обычно я не использую |f|
, это не очень важно для меня. Я предпочитаю использовать такое имя переменной:
= form_for @user do |user_form_builder|
= user_form_builder.input :username
Что, на мой взгляд, более читабельно и понятно.
08.04.2014
def log_out ... end
- Верно? 08.04.2014def log_out ... end
– это действие 08.04.2014f
!? 02.08.2016f
представляет объект построителя формы. Этот объект имеет несколько методов и атрибутов. Например,f.object
вернет экземпляр модели, используемый для формы.f.input :username
вызовет методinput
в экземпляре FormBuilder, который выполняет некоторую логику, чтобы определить, что полеusername
является строковым типом, поэтому элемент HTML будет простым текстом типа ввода. 02.08.2016