ruby-on-rails – form_for – Ruby on Rails

我不明白form_for.

我尝试实现这个tutorial,我不明白视图代码.
此外,我不明白api,否则我不会在这里问
<%= form_for @user,:as => :user,:url => sign_in_path(@user)do | f | %GT;

>什么是:as => :用户说?
>:url => sign_in_path很清楚,但是为什么它背后有一个(@user)?
>如何在不同的视图中访问@user?
3.1.我也希望在application.html.erb(布局)中登录,但是@user位于user_controller.rb中,而不在application_controller.rb中.
我该怎么做?
><%= form_for(User.new),...工作得很好,但我认为是不对的
>为什么会有/ forEach循环的东西?做| f | %GT;

谢谢你的帮助!

解决方法

一点解释( form_for documentation here):
<%= form_for @user,:as => :user,:url => sign_in_path(@user) do |f| %>

点1.:as => :用户

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

= 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约定,不会直接在视图中调用Model的名称,并且不建议在视图中引发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块,它表示将在form_for的上下文中执行的一段代码.我们使用form_for的实例作为管道中定义的变量,这里是| f |.我通常不使用| f |,这与我并不真正相关.我更喜欢使用这种变量名:

= form_for @user do |user_form_builder|
  = user_form_builder.input :username

我认为这是更可读和更容易理解.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...