简单解释一下 ( 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
<input type='text' name='user[username]'
第二点。 :url => sign_in_path(@user)
在这个教程中,@user
是这样设置的:
def sign_in
@user = User.new
end
第三点。 @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
第四点。 form_for (User.new)
我们在控制器中设置变量@user
,并将其作为参数传递给form_for
,因为这是Rails的约定,不要直接在视图中调用模型名称,并且在视图中触发SQL查询已被弃用。
例如:
<%= Post.find(params[:id]).title %>
def show
@post = Post.find(params[:id])
<%= @post.title %>
实例变量在控制器的操作中设置,在其动作、视图和局部视图之间共享。
第5点。在form_for中使用do/end块
请在此处提供您的输入,不确定如何解释它
代码的这一部分被称为do / end块,它表示将在form_for
的上下文中执行的代码片段。我们使用form_for
的实例作为在管道中定义的变量,在这里它是|f|
。我通常不使用|f|
,对我来说并不重要。我更喜欢使用这种变量名称:
= form_for @user do |user_form_builder|
= user_form_builder.input :username
我认为这种方式更易读且更容易理解。
:as => :user
将使表单字段名称,@user 可能表示 User 模型类的实例。 - Alok Anand表单中的第一个参数不能为空或为nil
。这很容易理解,它不能是nil或空值...但我如何访问或"路由"到user_controller.rb呢? - Ismoh