急遽、勉強しなくちゃいけなくなった Ruby on Rails の個人的なまとめ。 http://railstutorial.jp/chapters/sign-up?version=4.0#top
ユーザー登録
RESTアーキテクチャ
実際に動的なページを作っていくということは、アプリケーションをRESTアーキテクチャの習慣に従うということ。これを実現するための簡単な方法として、config/routes.rb に以下の行を追加。
1 2 3 | # config/routes.rb resources :users # get "users/new” |
この resouse :users という行だけで、RESTful なすべてのアクションが利用できるようになる。そのため、get “users/new” という行は削除することができる。
SHOW
まずは、 view を作成する(app/views/users/show.html.erb)。new.html.erb は自動で生成されたが、今回は自分で作成しなければならない。
1 2 | # app/views/users/show.html.erb <%= @user.name %>, <%= @user.email %> |
@user はインスタンス変数。これをコントローラー内で定義する。
1 2 3 4 | # app/controllers/users_controller.rb def show @user = User.find(params[:id]) end |
params[:id] はリクエストの値。users/1 であれば、params[:id] はUser.find(1) に置き換わる。
NEW and CREATE
まずは view を form_for メソッドを使って実装。もしエラーがある場合は、 shared/error_messages を表示させている。このエラーがあるかどうかは、shared/_error_messagedにて条件分岐をする。慣習的に、複数の controller に渡る view は sharedディレクトリに格納。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # app/views/users/new.html.erb <% provide(:title, 'Sign up') %> <h1>Sign up</h1> <div class="row"]] <div class="span6 offset3"]] <%= form_for(@user) do |f| %> <%= render 'shared/error_messages' %> <%= f.label :name %> <%= f.text_field :name %> <%= f.label :email %> <%= f.text_field :email %> <%= f.label :password %> <%= f.password_field :password %> <%= f.label :password_confirmation, "Confirmation" %> <%= f.password_field :password_confirmation %> <%= f.submit "Create my account", class: "btn btn-large btn-primary" %> <% end %> </div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 | # app/views/shared/_error_messages.html.erb <% if @user.errors.any? %> <div id="error_explanation"]] <div class="alert alert-error"]] The form contains <%= pluralize(@user.errors.count, "error") %>. </div> <ul> <% @user.errors.full_messages.each do |msg| %> <li>* <%= msg %></li> <% end %> </ul> </div> <% end %> |
form_for メソッドでは user インスタンス変数を使用しているので、それを controller で定義。
1 2 3 4 | # app/controllers/users_controller.rb def new @user = User.new end |
上記で作成したフォームは submit された時に、/users に対してPOST する。RESTアーキテクチャでは、この操作は create アクションにあたる(上の画像)。よって、 controller で以下のように create アクションを作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def create @user = User.new(user_params) if @user.save redirect_to @user else render 'new' end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end |
private 関数は、セキュリティ上、全てのパラメータを無条件で受付ないため。もし、ユーザーの作成、保存が成功したらそのユーザーページにリダイレクト。