Хобрук: Ваш путь к мастерству в программировании

form_for — Руби на рельсах

Я не понимаю form_for.

Я пытаюсь реализовать это руководство и Я не понимаю код просмотра.
Более того, я не понимаю API, иначе я бы не спрашивал здесь..

<%= form_for @user, :as => :user, :url => sign_in_path(@user) do |f| %>

  1. Что говорит :as => :user?
  2. :url => sign_in_path понятно, но почему за ним (@user)?
  3. И как я могу получить доступ к @user в другом View?
    3.1. Мне также нужна форма входа в application.html.erb (макет), НО @user находится в user_controller.rb, а не в application_controller.rb.
    Как я могу это сделать?
  4. <%= form_for (User.new), ... работает хорошо, но я думаю, что это неправильно..
  5. Почему существует что-то вроде цикла for/forEach? do |f| %>

Спасибо за вашу помощь!


  • :as => :user создаст имена полей формы, @user обозначает экземпляр, скорее всего, для класса модели User, 08.04.2014
  • см. этот ответ stackoverflow.com/questions/4436817/ 08.04.2014
  • Большое спасибо, но я пока не понимаю 3./3.1. @user в user_controller.rb работает хорошо, но в application.html.erb отображается следующая ошибка: First argument in form cannot contain nil or be empty. Ну, это вполне понятно.. Он не может быть нулевым или пустым..., но как я могу получить доступ или маршрут к user_controller.rb? 08.04.2014

Ответы:


1

Небольшое пояснение (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
  • ..это потрясающе! Большое спасибо! я сразу поняла!!! Тест для себя: Пункт 2: Если URL-адрес похож на log_out_path(@user), метод должен называться так же? def log_out ... end - Верно? 08.04.2014
  • @Исмо Да! Точно! Метод, определенный в контроллере, называется действием. def log_out ... end – это действие 08.04.2014
  • Хорошо, я думаю, что понял.. Спасибо. :] 08.04.2014
  • Спасибо, @KirtiThorat. Хочешь побороться за лучшее/лучшее объяснение следующего вопроса? Ах ах 08.04.2014
  • Вызов @MrYoshiji принят;) См. мой ответ здесь напишите определение с присоединением">stackoverflow.com/questions/22943651/ Что вы думаете? 08.04.2014
  • @KirtiThorat О!!! Я недооценил тебя, ты выиграла этот раунд, Кирти, но будь готова к следующему... ;) 08.04.2014
  • @MrYoshiji Нет проблем! Я люблю здоровую конкуренцию. :) 08.04.2014
  • @MrYoshiji, спасибо за объяснение, но я до сих пор не могу понять, что здесь делает f!? 02.08.2016
  • @eshan переменная f представляет объект построителя формы. Этот объект имеет несколько методов и атрибутов. Например, f.object вернет экземпляр модели, используемый для формы. f.input :username вызовет метод input в экземпляре FormBuilder, который выполняет некоторую логику, чтобы определить, что поле username является строковым типом, поэтому элемент HTML будет простым текстом типа ввода. 02.08.2016
  • Новые материалы

    Управление DOM для чайников вроде меня
    Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..