form_for - Ruby on Rails

Ism*_*moh 20 ruby ruby-on-rails ruby-on-rails-4

我不明白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(布局)中使用log-in-form ,但是@user它位于user_controller.rb和不在application_controller.rb.
    我怎样才能做到这一点?
  4. <%= form_for (User.new), ... 运作良好,但我认为这是不对的..
  5. 为什么有类似for/forEach-loop的东西? do |f| %>

谢谢你的帮助!

MrY*_*iji 35

一点点解释(这里的文档): form_for

<%= form_for @user, :as => :user, :url => sign_in_path(@user) do |f| %>
Run Code Online (Sandbox Code Playgroud)

第1点. :as => :user

这是用于生成输入名称(和params'名称)的名称,例如:

= form_for Admin.new, as: :user do |f|
                          #^^^^
  = f.input :username

# will generate an input like this:
<input type='text' name='user[username]' #... />
                        #^^^^
Run Code Online (Sandbox Code Playgroud)

第2点. :url => sign_in_path(@user)

在教程中,@user设置如下:

  def sign_in
    @user = User.new
  end
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

如果您想在应用程序的任何位置使其可用(意味着您必须连接到用户帐户才能浏览应用程序):

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
Run Code Online (Sandbox Code Playgroud)

第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 %>
Run Code Online (Sandbox Code Playgroud)

在Controller的Action中设置的实例变量动作,视图和部分视图之间共享.


点5.在form_for中执行/结束块

请在此时提供您的意见,不知道如何解释

这部分代码称为do/end块,它表示将在上下文中执行的一段代码form_for.我们使用form_for的实例作为管道中定义的变量,就在这里|f|.我通常不使用|f|,它与我无关.我更喜欢使用这种变量名:

= form_for @user do |user_form_builder|
  = user_form_builder.input :username
Run Code Online (Sandbox Code Playgroud)

我认为这更易读,更容易理解.