我不了解 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
(布局)中的登录表单,但@user
在user_controller.rb
中而不在application_controller.rb
中。我怎样才能做到这一点?
<%= form_for (User.new), ...
效果很好,但是我认为这是不正确的。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/