New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Railsのきれいなコードのお題案 #1

Open
willnet opened this Issue Dec 20, 2017 · 4 comments

Comments

Projects
None yet
3 participants
@willnet
Contributor

willnet commented Dec 20, 2017

「こういうのお題にしたらどうですかねー」みたいな物を投げる、案出し、議論用のスレです。

ref: Railsのきれいなコードについて議論する勉強会 - おもしろwebサービス開発日記チラシの裏

@sinsoku

This comment has been minimized.

Show comment
Hide comment
@sinsoku

sinsoku Dec 21, 2017

Model と画面上の form が1対1で一致しない場合、どのように実装するのが綺麗なのか?

ブログにカテゴリーを複数つけて投稿する機能。
はてなブログの投稿画面がイメージに近いです。

blog_img

おそらく、モデルは下記のように複数のモデルになると思います。

# app/models/article.rb
class Article < ApplicationRecord
  has_many :categories
end

# app/models/category.rb
class Category < ApplicationRecord
  belongs_to :article
end

実装方法の例

下記のような方法があると思いますが、それぞれメリット・デメリットがあると思う。

私が知らないだけで、他にも良い実装方法はあるかも。

sinsoku commented Dec 21, 2017

Model と画面上の form が1対1で一致しない場合、どのように実装するのが綺麗なのか?

ブログにカテゴリーを複数つけて投稿する機能。
はてなブログの投稿画面がイメージに近いです。

blog_img

おそらく、モデルは下記のように複数のモデルになると思います。

# app/models/article.rb
class Article < ApplicationRecord
  has_many :categories
end

# app/models/category.rb
class Category < ApplicationRecord
  belongs_to :article
end

実装方法の例

下記のような方法があると思いますが、それぞれメリット・デメリットがあると思う。

私が知らないだけで、他にも良い実装方法はあるかも。

@sinsoku

This comment has been minimized.

Show comment
Hide comment
@sinsoku

sinsoku Dec 21, 2017

メールを送信する処理をどこに書くべきか?

転職サイトでユーザーが求人に応募したとき、下記の3つのメールを送信したい。

  • ユーザーには「応募しました」のメール
    • ただし、初回の応募には注意事項に関する説明をつける
  • 企業には「応募がありました」のメール
  • 運営には「応募がありました」のメール

実装方法の例

Controller 内で愚直に呼び出した例は下記の通り。

# app/controllers/entries_controller.rb
class EntriesController < ApplicationController
  def create
    if @entry.save
      AdminMailer.new_entry(@entry).deliver_later
      CompanyMailer.new_entry(@entry).deliver_later
      if current_user.entries.count.zero?
        UserMailer.new_entry_with_description(@entry).deliver_later
      else
        UserMailer.new_entry(@entry).deliver_later
      end
    else
      render :new
    end
  end
end

これはちょっと微妙なコードですが、これを改善しようとした場合、どこにコードを置くのが綺麗なのか?

本題とは別の話ですが...

そもそも、Mailer のクラス名やメソッド名はどのようにするのが綺麗なのか。

sinsoku commented Dec 21, 2017

メールを送信する処理をどこに書くべきか?

転職サイトでユーザーが求人に応募したとき、下記の3つのメールを送信したい。

  • ユーザーには「応募しました」のメール
    • ただし、初回の応募には注意事項に関する説明をつける
  • 企業には「応募がありました」のメール
  • 運営には「応募がありました」のメール

実装方法の例

Controller 内で愚直に呼び出した例は下記の通り。

# app/controllers/entries_controller.rb
class EntriesController < ApplicationController
  def create
    if @entry.save
      AdminMailer.new_entry(@entry).deliver_later
      CompanyMailer.new_entry(@entry).deliver_later
      if current_user.entries.count.zero?
        UserMailer.new_entry_with_description(@entry).deliver_later
      else
        UserMailer.new_entry(@entry).deliver_later
      end
    else
      render :new
    end
  end
end

これはちょっと微妙なコードですが、これを改善しようとした場合、どこにコードを置くのが綺麗なのか?

本題とは別の話ですが...

そもそも、Mailer のクラス名やメソッド名はどのようにするのが綺麗なのか。

@sinsoku

This comment has been minimized.

Show comment
Hide comment
@sinsoku

sinsoku Dec 21, 2017

複数レコードに対する操作を Rails で作るとき、どのような URL やモデル設計にするのが綺麗なのか?

普通の Rails で作られる RESTful には無い bulk update な要件。

ToDo リストで複数のタスクに対して「まとめて完了にする」「まとめてタグを付ける」などをする機能。
remember the milkの画面がイメージに近いです。

todo

似たような機能でありがちなものだと、「通知をまとめて既読にする」とかもあります。

sinsoku commented Dec 21, 2017

複数レコードに対する操作を Rails で作るとき、どのような URL やモデル設計にするのが綺麗なのか?

普通の Rails で作られる RESTful には無い bulk update な要件。

ToDo リストで複数のタスクに対して「まとめて完了にする」「まとめてタグを付ける」などをする機能。
remember the milkの画面がイメージに近いです。

todo

似たような機能でありがちなものだと、「通知をまとめて既読にする」とかもあります。

@miyohide

This comment has been minimized.

Show comment
Hide comment
@miyohide

miyohide Dec 22, 2017

複数の項目からなる検索フォームを実装するときに、検索フォームの各項目や項目間に対してvalidationを加えたいことがあります。例として楽天トラベルさんの検索フォームを出します。

2017-12-22 21 14 01

この例で言えば、「チェックアウト日」は「チェックイン日」よりも後とか「合計金額」の上限と下限の関係とかをチェックするような処理です。

個人的には、Form Objectを作ってそこでvalidationと検索処理を実装するのですが、検索処理の実装がごちゃごちゃになってしまいます。検索処理というとransack gemが有名なのですが、これもどうなのかなと思っている次第です。

miyohide commented Dec 22, 2017

複数の項目からなる検索フォームを実装するときに、検索フォームの各項目や項目間に対してvalidationを加えたいことがあります。例として楽天トラベルさんの検索フォームを出します。

2017-12-22 21 14 01

この例で言えば、「チェックアウト日」は「チェックイン日」よりも後とか「合計金額」の上限と下限の関係とかをチェックするような処理です。

個人的には、Form Objectを作ってそこでvalidationと検索処理を実装するのですが、検索処理の実装がごちゃごちゃになってしまいます。検索処理というとransack gemが有名なのですが、これもどうなのかなと思っている次第です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment