【Ruby on Rails5】railsでページネーションを導入する
以下のように1ページに100ユーザーも表示されているのを
1ページ30ユーザーの表示にするため、
ページネーションを導入します。
Railsには豊富なページネーションメソッドが用意されています。
今回はその中で最もシンプルかつ堅牢なwill_paginateメソッドを使って
ページネーションを実現します!!
will_paginateを利用するには、
Gemfileにwill_paginate gem とbootstrap-will_paginate gemを両方含め、Bootstrapのページネーションスタイルを使ってwill_paginateを構成する必要があります。
では、gemfileに以下のように追加します。
gem 'will_paginate', '3.1.6' gem 'bootstrap-will_paginate', '1.0.0'
gemをインストール!!
$ bundle install
gemのインストールが完了しました。
まずはuser一覧のindex.html.erbに対して
ページネーションしたい箇所を指示する必要があります。
以下で該当箇所を囲えばOK
<%= will_paginate %>
こんな感じ
<h1>All users</h1> <%= will_paginate %> <ul class="users"> <% @users.each do |user| %> <li> <%= gravatar_for user, size: 50 %> <%= link_to user.name, user %> </li> <% end %> </ul> <%= will_paginate %>
あとはcontrollerのindexメソッドで
def index @users = User.all end
こうやって取得していた箇所を
def index @users = User.paginate(page: params[:page]) end
こうやってpagginateを利用するように修正します。
これで以下のようにページネーションが適用されます!
超簡単ですね!
ちなみにデフォルトは30件となっています。
【Ruby on Rails5】Faker gemを利用してダミーデータを作成する
userの一覧画面などを実装した際に
userデータを一件ずつ画面登録していくのは超面倒ですね!
Fakerというgemでダミーデータを作成してしまいましょう。
gemfileに以下を追加
gem 'faker', '1.7.3'
続いてインストール
$ bundle install
db/seeds.rbに以下のようにループ処理をかく
99.times do |n| name = Faker::Name.name email = "example-#{n+1}@railstutorial.org" password = "password" User.create!(name: name, email: email, password: password, password_confirmation: password)
適用
$ rails db:seed
User一覧にダミーデータが登録されました!
【Ruby on Rails】rails consoleをサンドバッグモードで起動する
サンドボックスモードで起動する。
このモードで起動するとコンソール自体が一つのトランザクションになるので色々便利
コンソール終了時にデータベースに関する変更をロールバックすることが可能に。
sandboxオプションをつけて起動する方法は以下のコマンド
rals c --sandbox(もしくは--s)
やってみます。
hodzumitakanori-no-MacBook-Air:sample_app hodzumitakanori$ rails c --sandbox Running via Spring preloader in process 5428 Loading development environment in sandbox (Rails 5.1.2) Any modifications you make will be rolled back on exit irb(main):001:0>
Any modifications you make will be rolled back on exit
(あなたが行った変更は、終了時にロールバックされます)
とメッセージが出ています。
hodzumitakanori-no-MacBook-Air:sample_app hodzumitakanori$ rails c -s Running via Spring preloader in process 5545 Loading development environment in sandbox (Rails 5.1.2) Any modifications you make will be rolled back on exit Cannot read termcap database; using dumb terminal settings. irb(main):001:0> User.create(name: "Hozumi", email: "hozu@mail") (0.1ms) SAVEPOINT active_record_1 SQL (0.5ms) INSERT INTO "users" ("name", "email", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Hozumi"], ["email", "hozu@mail"], ["created_at", "2018-01-13 01:30:04.398166"], ["updated_at", "2018-01-13 01:30:04.398166"]] (0.1ms) RELEASE SAVEPOINT active_record_1 => #<User id: 2, name: "Hozumi", email: "hozu@mail", created_at: "2018-01-13 01:30:04", updated_at: "2018-01-13 01:30:04"> irb(main):002:0> User.all User Load (0.3ms) SELECT "users".* FROM "users" LIMIT ? [["LIMIT", 11]] => #<ActiveRecord::Relation [#<User id: 1, name: "Hozumi", email: "hozu@mail", created_at: "2018-01-13 01:27:21", updated_at: "2018-01-13 01:27:21">, #<User id: 2, name: "Hozumi", email: "hozu@mail", created_at: "2018-01-13 01:30:04", updated_at: "2018-01-13 01:30:04">]> irb(main):003:0> exit (2.3ms) rollback transaction
exitでrollbackされました!
コマンドラインからherokuアプリを削除
$ heroku apps:info # アプリの確認 $ heroku apps:destroy --app アプリ名
【Ruby on Rails】使用するアクションのルーティングだけを設定する方法
リソースベースのルーティングを使ってroutes.rbファイルに設定を記述すると自動で7つのルーティングが設定されてしまい、邪魔です。
post_comments GET /posts/:post_id/comments(.:format) comments#index POST /posts/:post_id/comments(.:format) comments#create new_post_comment GET /posts/:post_id/comments/new(.:format) comments#new edit_post_comment GET /posts/:post_id/comments/:id/edit(.:format) comments#edit post_comment GET /posts/:post_id/comments/:id(.:format) comments#show PATCH /posts/:post_id/comments/:id(.:format) comments#update PUT /posts/:post_id/comments/:id(.:format) comments#update DELETE /posts/:post_id/comments/:id(.:format) comments#destroy
例えば上記のうち、createとdestroyのみルーティング設定したい場合、
以下のようにroutes.rbに設定すればOK
既存の設定
resources :posts do resources :comments end
必要なもののみ設定
resources :posts do resources :comments, only: [:create, :destroy] end
【Ruby on Rails】RailsのStrong Parametersとは
Strong ParametersはDBに入れる値を制限することで、不正なパラメータの入力を防ぐ仕組み
rails4 から導入されたようです。
例えば以下のように受け取ったパラメーターを検証せずにDBに直接保存するようにしていた場合、
def create # render plain: params[:post].inspect # save @post = Post.new(params.require([:post])) @post.save # redirect redirect_to posts_path end
parameterを許可してDB登録するには
①requireでPOSTで受け取る値のキーを設定
②permitで許可するカラムを設定
が必要です。
例:
params.require(:post).permit(:title, :body)
この検証はよくprivate mehodにまとめられるので
処理を切り出して使いましょう。