This post is Private. Only a writer or those who know its URL can access this post.

Article information
Show article in Markdown
Report article
Help us understand the problem. What is going on with this article?

Ruby on RailsでCRUD操作が出来るタスク管理アプリケーション構築 Part5

Part4で構築したRailsアプリケーションに以下を追加実装.

:small_blue_diamond: データ絞り込み(並べ替え等).
:small_blue_diamond: scope活用.
:small_blue_diamond: フィルタでの重複制御.
:small_blue_diamond: URLリンク表示.

最終成果物

■ データ絞り込み.

データを絞り込んで検索・更新等を行う際には、以下を意識してコードを組み立てる.
1. 起点.
2. 絞り込み条件.
3. 実行部分.

# 1.User  2.where(admin:true) 3.first
User.where(admin:true).first

コンソール上で生成予定のSQLを確認.

> User.where(admin: true).to_sql
=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"admin\" = TRUE"

今回はタスク一覧を作成日時の新しい順に並べ替えを行う.

app/controllers/task_controller.rb
# [ 変更前 ]
class TasksController < ApplicationController
  def index
    @tasks = current_user.tasks
  end
end

# [ 変更後 ]
class TasksController < ApplicationController
  def index
    @tasks = current_user.tasks.order(created_at: desc)
  end
end

■ scope活用.

クエリ用のメソッドの連続した呼び出し部分に名前をつけ、カスタムクエリーとして利用可能.

app/models/task.rb
class Task < ApplicationRecord
  ...
  belongs_to :user

  scope :recent, -> { order(created_at: :desc) }
  ...
end
app/controllers/tasks_controller.rb
class TasksController < ApplicationController
  def index
    @tasks = current_user.tasks.recent
  end
end

■ フィルタでの重複制御.

Taskに対するCRUD操作(show/edit/update/destroy)において変更時に重複しないで済むよう共通化.

app/controllers/tasks_controller.rb
class TasksController < ApplicationController
  before_action :set_task, only: [:show, :edit, :update, :destroy]

  def show
  end

  def edit
  end

  def update
    @task.update!(task_params)
    redirect_to tasks_url, notice: "タスク「#{task.name}」を更新しました。"
  end

  def destroy
    @task.destroy
    redirect_to tasks_url, notice: "タスク「#{task.name}」を削除しました。"
  end

  private

  def set_task
    @task = current_user.tasks.find(params[:id])
  end
end

■ URLリンク表示.

aタグでリンク表示する際、rails_autolinkというメソッドが提供されている.

Gemfileにgem追加後、bundleでインストール実行.

gem 'rails_autolink'

タスク詳細画面に詳しい説明が見れるようリンクを表示.

app/views/tasks/show.html.slim
...
tr
  th= Task.human_attribute_name(:description)
  td= auto_link(simple_format(h(@task.description), {}, sanitize: false, wrapper_tag: "div"))
machio77777
プロジェクトマネージャー / 最近はマネージメント業務や、クライアント折衝がメインのため、業務でコードは書きませんが、プライベートで調べたことをメモ書きレベルで投稿しています。
https://tana-labo.tokyo/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした