我不明白这个? (Ruby on Rails)

时间:2016-07-17 17:25:11

标签: ruby-on-rails ruby controller

我是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)

3 个答案:

答案 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中的操作):

enter image description here

请注意,网址/photos会路由到indexcreate操作。 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参数。