2016-07-17 1 views
1

Я новичок в RoR, и у меня есть некоторые проблемы с пониманием некоторых из кода. Я попытался найти его, но результаты не помогли мне.Я не могу это понять? (Ruby on Rails)

Вот код, расположенный в пользовательском контроллере. (Если вам нужен любой другой код, комментарии, и я буду обновлять

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 

Это часть курса программирования, который не смог объяснить мне это правильно. Я вообще в курсе, что это для формы регистрации , но у меня возникли проблемы постигая процессы создания и функции user_params.

Когда я прошу о помощи я прошу вас вести меня через процесс, что происходит. мне нужна конкретная помощь с params.require(:user).permit(:first_name, :last_name, :email, :password)

ответ

3
@user = User.new(user_params) #I didn't see any parameters in the constructor 

user_params - это название метода. В рубине вы можете вызвать метод без записи () после имени метода. Если вы посмотрите вниз в нижней части кода вы в курсе, вы можете увидеть определение метода:

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”=>”[email protected]”} 
******* 

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? 

Сеанс используется для переменных сохраняется от одного запроса к другому.Сеанс похож на Hash, а :user_id - это случайный ключ, который вы создаете в Hash. Вы можете назвать ключ чем угодно, но он должен описать данные, которые вы сохраняете.

@user.id - это значение, которое вы сохраняете в сеансе Hash. id приходит от пользователя, созданного здесь:

@user = User.new(user_params) 

Я вообще в курсе, что это за форму регистрации, но у меня возникают проблемы постигая процессы создания и функции user_params.

Сначала вы используете запрос GET для отображения формы для создания нового пользователя - вы делаете это, введя localhost:3000/users/new в своем браузере. Это отобразит форму. Тег <form> имеет атрибут action, который указывает URL-адрес, в котором форма отправит запрос, сопровождаемый данными.

Если вы используете инструменты разработчика вашего браузера, вы можете нажать на что-то вроде Page Source, чтобы увидеть необработанный HTML формы, который будет выглядеть примерно так:

<form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post"> 
... 
... 

Запрос POST, который отправляется в url /users направляется на действие create в UserController. Это потому, что, когда вы объявляете маршрут как:

resources :users 

или

resources :photos 

Rails использует the chart below для маршрутизации URL-адресов на действия (в данном случае URLs направляются к действиям в PhotosController):

enter image description here

Обратите внимание, что URL /photos направляется как index и create действий. Rails проверяет, является ли запрос GET-запросом или запросом POST, чтобы определить, какое действие выполнить.

За дополнительной информацией, обращайтесь к Rails Guide on routing.

1

Здесь два тонны. Контроллер er, вероятно, отображается на путь /users/. Контроллер направит все POST на create. Точно так же он направит все GET на index. Который у вас нет.

user_params - это функция, которая была создана, вероятно, как часть ваших лесов. Как rails generate ... В старых версиях Rails это было не так. Это позволяет вам заявить, что для области пользователя, first_name, last_name и т. Д. Разрешено отправлять через POST. Почему это делается? В основном безопасность. Он позволяет вам выполнять настройки белого списка, чтобы, например, user.admin не удалось обновить. Вы можете узнать больше об этом here.

+0

Фактически все это было написано вручную в качестве инструкций. В частности, в классе user_params я не понимаю, откуда пришел пользовательский символ. Мое предположение состоит в том, что: user - это таблица в модуле пользователя, а first_name, last_name и т. Д. - это поля. –

+0

Правильно. ': user' сопоставляется с классом' User', который сопоставляется с таблицей 'users'.Вот почему они называют конфигурацию RoR по конфигурации. Вы не знаете об этом, потому что нет файлов конфигурации, говорящих: пользователь. Вам просто нужно знать, что для класса пользователя требуются поля, все в области «пользователь», когда POSTing в JSON. –

0

В вашем веб-приложении вы можете создавать и обновлять информацию пользователей. Например, как в ваших представлениях new.html.erb (которые создают нового пользователя), так и в файле edit.html.erb (которые обновляют информацию существующего пользователя), вы, вероятно, создадите форму, чтобы пользователи могли вводить свою информацию (с помощью начальной загрузки).

<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 (: пользователь) .permit (: first_name,: last_name,: адрес электронной почты, пароль:)" позволит контроллер пользователю изменять имя пользователя first_name, last_name, email и пароль с безопасностью.

+0

Но в модуле пользователя нет параметра «пароль», только «: password_digest». –

Смежные вопросы