我不了解 form_for

我尝试实现此tutorial,但我不理解 View 代码。
而且我不懂这个api,否则我不会在这里问。<%= form_for @user, :as => :user, :url => sign_in_path(@user) do |f| %>

  • :as => :user 说什么?
  • :url => sign_in_path很清楚,但是为什么后面有一个 (@user)
  • 我如何以其他@user访问 View
    3.1。我还想要application.html.erb(布局)中的登录表单,但@useruser_controller.rb中而不在application_controller.rb中。
    我怎样才能做到这一点?
  • <%= form_for (User.new), ...效果很好,但是我认为这是不正确的。
  • 为什么会有for / forEach循环之类的东西? do |f| %>

  • 谢谢你的帮助!

    最佳答案

    一点解释( form_for documentation here):

    <%= 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)
    我们在 Controller 中设置变量@user并将其作为参数传递给form_for,因为它是一种Rails约定,永远不要直接在 View 中调用模型的名称,并且不建议在 View 中引发SQL查询。

    例:
    ######## WRONG
    # view
    <%= Post.find(params[:id]).title %>
    
    ######## MUCH BETTER
    # controller's action:
    def show
      @post = Post.find(params[:id])
    
    # view
    <%= @post.title %>
    

    在 Controller 的操作中设置的实例变量在操作,其 View 及其部分 View 之间共享。

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

    请在此输入您的输入,不确定如何解释

    这部分代码称为do / end块,它表示将在form_for上下文中执行的一段代码。我们将form_for的实例用作管道中定义的变量,此处为|f|。我通常不使用|f|,它与我并没有真正的关系。我更喜欢使用这种变量名:
    = form_for @user do |user_form_builder|
      = user_form_builder.input :username
    

    我认为这更具可读性,更容易理解。

    关于ruby-on-rails - form_for-Ruby on Rails,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22941664/

    10-12 01:16
    查看更多