form_for - Ruby on Rails

21

我不理解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. 如何在不同的View中访问@user
    3.1 我还想在application.html.erb(布局)中放置登录表单,但@useruser_controller.rb而不是application_controller.rb中。
    我该怎么做?
  4. <%= form_for (User.new), ... 可以正常工作,但我认为这不对。
  5. 为什么要使用类似于for/forEach循环的东西? do |f| %>

感谢您的帮助!


:as => :user 将使表单字段名称,@user 可能表示 User 模型类的实例。 - Alok Anand
1
请查看此答案:https://dev59.com/pFLTa4cB1Zd3GeqPcKTS - Alok Anand
非常感谢,但是我还不理解3./3.1的内容。在user_controller.rb中@user运行正常,但在application.html.erb中显示以下错误: 表单中的第一个参数不能为空或为nil。这很容易理解,它不能是nil或空值...但我如何访问或"路由"到user_controller.rb呢? - Ismoh
1个回答

36

简单解释一下 ( 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]' #... />
                        #^^^^

第二点。 :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查询已被弃用。

例如:

######## WRONG
# view
<%= Post.find(params[:id]).title %>

######## MUCH BETTER
# controller's action:
def show
  @post = Post.find(params[:id])

# view
<%= @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

我认为这种方式更易读且更容易理解。

太棒了!非常感谢!我现在明白了!!!为自己做个测试:Point2:如果URL类似于“log_out_path(@user)”,那么方法应该命名相同吗?def log_out ... end - 是这样吗? - Ismoh
@Ismoh 是的!没错!在控制器中定义的方法被称为动作(Action)。def log_out ... end 就是一个动作。 - MrYoshiji
谢谢@KirtiThorat--你想挑战下一个问题的最佳/最好的解释吗?哈哈 - MrYoshiji
@KirtiThorat 哦!我低估了你,你赢了这一轮,Kirti,但准备好下一轮吧... ;) - MrYoshiji
@MrYoshiji 没问题!我喜欢健康的竞争。 :) - Kirti Thorat
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接