2016-07-17 7 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は、メソッドの名前です。 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”=>”[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機能プロセスを理解 問題を抱えています。

まず、新しいユーザーを作成するためのフォームを表示するには、localhost:3000/users/newと入力してください。それはフォームを表示します。 <form>タグにはactionという属性があります。この属性は、フォームがデータとともに要求を送信するURLを指定します。

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

に送信されるPOSTリクエスト:あなたのブラウザの開発者ツールを使用している場合

、あなたはこのようになります。これは、フォームの生のHTMLを見てPage Sourceのようなものをクリックすることができますurl /usersは、UsersController内のcreateアクションにルーティングされます。

:RailsはアクションへのルートのURL(この場合はURLがをPhotosControllerのアクションにルーティングされている)に the chart belowを使用しています
resources :photos 

resources :users 

:あなたのようなルートを宣言するときだからです

enter image description here

URL /photosは、indexとの両方にルーティングされますアクション。 Railsは、リクエストがGETリクエストかPOSTリクエストかを調べて、実行するアクションを判断します。

詳細については、Rails Guide on routingを参照してください。

1

ここでは2つの細い部分があります。おそらく/users/パスにマップされています。コントローラーはPOSTcreateに設定します。同様に、GETindexになります。あなたは持っていない。

user_paramsはおそらくあなたの足場の一部として作成された機能です。 Like rails generate ...旧バージョンのRailsでは、そうではありませんでした。これにより、ユーザースコープのfirst_name、last_nameなどがPOST経由で送信されることを許可することができます。これはなぜですか?ほとんどのセキュリティ。たとえば、user.adminを更新できないように、パラメータをホワイトリストに登録することができます。あなたはそれについての詳細を読むことができますhere

+0

実際には、すべてこれを手動で説明書として書いています。特にuser_paramsクラスでは、:userシンボルがどこから来たのか分かりません。 私の前提は次のとおりです。userはUserモジュールのテーブルで、first_name、last_nameなどはフィールドです。 –

+0

そうです。 ':user'は' User'クラスにマップされ、 'user'テーブルにマップされます。これは、RoR規約を設定よりも呼び出す理由です。あなたはこれについて知りません。なぜなら、what:userが何の設定ファイルもないからです。あなたはJSONでPOSTする際にUserクラスが '' user ''スコープ内のすべてのフィールドを必要としていることを知っておく必要があります。 –

0

web-appでは、ユーザーの情報を作成して更新することができます。 たとえば、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"だけです。 –

関連する問題