我是RoR的新手,我在理解某些代码时遇到了一些麻烦。 我试着查一下,但结果并没有帮助我。
以下是位于用户控制器中的代码。 (如果您需要任何其他代码,请对其进行评论,我会更新
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params) #I didn't see any parameters in the constructor
if @user.save #Checks if @user was saved?
session[:user_id] = @user.id #Creates a session? What's :user_id and @user_id?
redirect_to'/' #Redirects to http://localhost:8000/
else
redirect_to '/signup' #If all fails go back to signup page
end
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password)
end
end
这是编程课程的一部分,但未能正确解释这一点。我一般都知道这是一个注册表单,但我无法理解create和user_params函数进程。
当我寻求帮助时,我要求你引导我完成正在发生的事情。
我还需要具体的帮助
params.require(:user).permit(:first_name, :last_name, :email, :password)
答案 0 :(得分:3)
@user = User.new(user_params) #I didn't see any parameters in the constructor
user_params
是方法的名称。在ruby中,您可以在方法名称后面不调用()
来调用方法。如果您查看所发布代码的底部,可以看到方法定义:
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password)
end
end
该方法返回一些内容,并在构造函数中使用该返回值。您可以通过在代码中添加以下内容来查看返回值:
def create
@user = User.new(user_params)
puts '******'
p user_params
puts '******'
...
...
end
然后在服务器窗口中查看输出。你会看到类似的东西:
******
{“first_name"=>”Joe”, “last_name”=>”Smith”, “email”=>”joe_smith@yahoo.com”}
*******
params.require
与安全性有关。该主题称为strong parameters
,您可以在此处阅读:
https://www.sitepoint.com/rails-4-quick-look-strong-parameters/
if @user.save #Checks if @user was saved?
是:
默认情况下,
save
始终运行验证。如果其中任何一个失败了 动作被取消,保存返回false。
session[:user_id] = @user.id #Creates a session? What's :user_id and @user_id?
会话用于使变量从一个请求持久存储到另一个请求。会话就像一个哈希,而:user_id
只是你在哈希中创建的一个随机密钥。您可以根据需要为密钥命名,但它应描述您要保存的数据。
@user.id
是您在会话哈希中保存的值。 id
来自您在此处创建的用户:
@user = User.new(user_params)
我一般都知道这是注册表格,但我有 麻烦理解create和user_params函数进程。
首先,您使用GET请求显示用于创建新用户的表单 - 您可以在浏览器中输入localhost:3000/users/new
来执行此操作。这将显示表单。 <form>
标记具有action
属性,该属性指定表单将发送带有数据的请求的网址。
如果您使用浏览器的开发人员工具,可以点击Page Source
之类的内容来查看表单的原始html,如下所示:
<form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
...
...
发送到网址/users
的POST请求将路由到UsersController中的create
操作。那是因为当你声明一条路线时:
resources :users
或
resources :photos
Rails使用the chart below将url路由到操作(在这种情况下,url被路由到PhotosController中的操作):
请注意,网址/photos
会路由到index
和create
操作。 Rails检查请求是GET请求还是POST请求,以确定要执行的操作。
有关其他信息,请查看Rails Guide on routing。
答案 1 :(得分:1)
这里有两个。控制器可能映射到/users/
路径。控制器会将所有POST
定向到create
。同样,它会将所有GET
定向到index
。你没有。
user_params
是一个可能作为脚手架的一部分创建的函数。就像rails generate ...
在旧版本的Rails中,它不是这样的。这允许您对用户范围说,允许通过POST提交first_name,last_name等。为什么这样做?主要是安全性。它允许您列入白名单参数,以便例如user.admin
无法更新。您可以阅读更多相关信息here。
答案 2 :(得分:0)
在您的网络应用中,您可能想要创建和更新用户信息。 例如,在您的视图new.html.erb(创建新用户)和edit.html.erb(更新现有用户的信息)中,您可能会呈现一个表单以允许用户键入他们的信息(使用bootstrap)。 / p>
<div class='row'>
<div class='col-xs-12'>
<%= form_for(@user, :html => {class: "form-horizontal", role:"form"}) do |f| %>
<div class="form-group">
<div class="control-label col-sm-2">
<%= f.label :first_name,"FName:" %>
</div>
<div class="col-sm-8">
<%= f.text_field :last_name, class: "form-control", placeholder: "Enter username", autofocus: true %>
</div>
</div>
<div class="form-group">
<div class="control-label col-sm-2">
<%= f.label :last_name,"LName:" %>
</div>
<div class="col-sm-8">
<%= f.text_field :last_name, class: "form-control", placeholder: "Enter username" %>
</div>
</div>
<br>
<div class="form-group">
<div class="control-label col-sm-2">
<%= f.label :email, "Email:" %>
</div>
<div class="col-sm-8">
<%= f.email_field :email, class: "form-control", placeholder: "Enter your email" %>
</div>
</div>
<br>
<div class="form-group">
<div class="control-label col-sm-2">
<%= f.label :password, "Password:" %>
</div>
<div class="col-sm-8">
<%= f.password_field :password, class: "form-control", placeholder: "Enter your password" %>
</div>
</div>
<br>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<%= f.submit(@user.new_record? ? "Sign up now!" : "Update your account", class:'btn btn-primary btn-lg') %>
</div>
</div>
<% end %>
<div class="col-xs-6 col-xs-offset-3">
[ <%= link_to 'Cancel request and return to home', root_path %> ]
</div>
</div>
回到你的问题: 通过执行“params.require(:user).permit(:first_name,:last_name,:email,:password)”将允许用户控制器使用安全性修改first_name,last_name,email和password参数。