我不明白form_for.
@H_404_2@我尝试实现这个tutorial,我不明白视图代码.
此外,我不明白api,否则我不会在这里问
<%= form_for @user,:as => :user,:url => sign_in_path(@user)do | f | %GT; @H_404_2@>什么是: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; @H_404_2@谢谢你的帮助!
此外,我不明白api,否则我不会在这里问
<%= form_for @user,:as => :user,:url => sign_in_path(@user)do | f | %GT; @H_404_2@>什么是: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; @H_404_2@谢谢你的帮助!
解决方法
一点解释(
form_for
documentation here):
<%= form_for @user,:as => :user,:url => sign_in_path(@user) do |f| %>@H_404_2@点1.:as => :用户 @H_404_2@这是用于生成输入名称(和参数名称)的名称,例如:
= form_for Admin.new,as: :user do |f| #^^^^ = f.input :username # will generate an input like this: <input type='text' name='user[username]' #... /> #^^^^@H_404_2@点2.:url => sign_in_path(@user) @H_404_2@在本教程中,@user设置如下:
def sign_in @user = User.new end@H_404_2@点3. @user可用于其他操作 @H_404_2@你必须在你想要的每个动作中设置这个变量.它可以是多余的,所以你可以使用一个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@H_404_2@如果您希望在应用程序中随处可见(意味着您必须连接到用户帐户才能浏览应用程序):
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@H_404_2@要点4. form_for(User.new) @H_404_2@我们将变量@user设置在控制器中,并将其作为参数传递给form_for,因为它是一个Rails约定,不会直接在视图中调用Model的名称,并且不建议在视图中引发SQL查询. @H_404_2@例:
######## WRONG # view <%= Post.find(params[:id]).title %> ######## MUCH BETTER # controller's action: def show @post = Post.find(params[:id]) # view <%= @post.title %>@H_404_2@控制器动作中设置的实例变量在动作及其视图及其部分视图之间共享. @H_404_2@点5.在form_for中执行/结束块 @H_404_2@此时请提供您的意见,不知道如何解释 @H_404_2@这部分代码被称为do / end块,它表示将在form_for的上下文中执行的一段代码.我们使用form_for的实例作为管道中定义的变量,这里是| f |.我通常不使用| f |,这与我并不真正相关.我更喜欢使用这种变量名:
= form_for @user do |user_form_builder| = user_form_builder.input :username@H_404_2@我认为这是更可读和更容易理解.