2016-07-17 3 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 항상 실행 검증. 둘 중 하나라도 실패하면 작업이 취소되고 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) 

나는 이것이 가입 양식입니다 일반적으로 알고 있어요,하지만 난 만들고 user_params 기능 프로세스를 이해하는 문제가 발생하고있다.

먼저 GET 요청을 사용하여 새 사용자를 만들기위한 양식을 표시합니다. 브라우저에 localhost:3000/users/new을 입력하면됩니다. 그러면 양식이 표시됩니다. <form> 태그는 양식이 데이터와 함께 요청을 보낼 URL을 지정하는 action 속성을가집니다. 브라우저의 개발자 도구를 사용하는 경우

, 당신은 다음과 같이 보일 것이다, 형태의 원시 HTML을 볼 수 Page Source 같은 것을 클릭 할 수 있습니다 :

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

받는 전송되는 POST 요청 url /users은 UsersController의 create 작업으로 라우팅됩니다.

:

resources :users 

또는

resources :photos 

레일 (이 경우의 URL이 PhotosController 조치로 연결됩니다) 행동 경로 URL에 the chart below을 사용하면 같은 경로를 선언 할 때 때문이다

enter image description here

URL /photosindexcreate 조치. Rails는 요청이 GET 요청인지 POST 요청인지 확인하여 실행할 작업을 결정합니다.

자세한 내용은 Rails Guide on routing을 확인하십시오.

1

여기에는 두 가지가 있습니다. 어쩌면 /users/ 경로로 매핑됩니다. 컨트롤러는 모두 POSTcreate으로 지정합니다. 마찬가지로 GETindex으로 지정합니다. 당신은 가지고 있지 않습니다.

user_params은 아마도 스 캐 폴딩의 일부로 작성된 기능입니다. 마찬가지로 rails generate ... 이전 버전의 레일즈에서는 그렇지 않았습니다. 이렇게하면 사용자 범위에 대해 first_name, last_name 등이 POST를 통해 제출되도록 허용 할 수 있습니다. 왜이 일을 했습니까? 주로 보안. 허용 된 매개 변수를 사용하여 예를 들어 user.admin을 업데이트 할 수 있습니다. 자세한 내용은 here을 참조하십시오.

+0

실제로이 모든 것은 수동으로 지침으로 작성되었습니다. 특히 user_params 클래스에서, : user 기호가 어디에서 왔는지 이해할 수 없습니다. 필자의 가정은 다음과 같습니다. user는 User 모듈의 테이블이고 first_name, last_name 등은 필드입니다. –

+0

맞습니다. ': user'는'User' 클래스에 매핑됩니다.이 클래스는'users' 테이블에 매핑됩니다.이것이 RoR 규칙을 구성에 부르는 이유입니다. 어떤 설정 파일이 없기 때문에 당신은 이것에 대해 알지 못할 것입니다 : user는. 당신은 JSON에서 POST 할 때 User 클래스가''user ''범위의 모든 필드를 필요로한다는 것을 알아야 할 것입니다. –

0

웹 응용 프로그램에서 사용자의 정보를 만들고 업데이트 할 수 있습니다. 예를 들어, 새로운 사용자 인 new.html.erb와 기존 사용자의 정보를 업데이트하는 edit.html.erb에서 사용자가 정보를 입력 할 수 있도록 양식을 렌더링 할 수 있습니다 (부트 스트랩 포함). "(: 사용자) .permit (: FIRST_NAME : LAST_NAME : 이메일 : 암호) params.require를" 수행하여 위로 질문에

<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> 
사용자 컨트롤러를 수정할 수 있습니다 당신은 보안과 first_name, last_name, 이메일 및 암호 매개 변수.

+0

그러나 사용자 모듈에는 "password"매개 변수가없고 ": password_digest"매개 변수 만 있습니다. –