質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Ruby

    7017questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Rubyでクラスとインスタンスを用いてコードを書き換えたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 592

soony

score 27

学校の課題で、クラスとインスタンスを使って現在のコードを書き換えたいのですが、途中まで考えてわからなかったので教えてほしいです。

def post_review(a_posts)

    post = {}
    puts "ジャンルを入力してください"
    post[:genre] = gets.chomp
    puts "タイトルを入力してください"
    post[:title] = gets.chomp
    puts "感想を入力してください"
    post[:review] = gets.chomp
    line = "-------------------------------"

    puts "ジャンル : #{post[:genre]}\n#{line}"
    puts "タイトル : #{post[:title]}\n#{line}"
    puts "感想 : \n#{post[:review]}\n#{line}"


    a_posts << post

    return a_posts
  end

def read_reviews(a_posts)

  number = 0
  a_posts.each do |post|
    puts "[#{number}] : #{post[:title]}のレビュー"
    number += 1
  end

  puts "\nみたいレビューの番号を入力してください :"
  input = gets.to_i


  post = a_posts[input]


  line = "-------------------------------"
  puts "ジャンル : #{post[:genre]}\n#{line}"
  puts "タイトル : #{post[:title]}\n#{line}"
  puts "感想 : \n #{post[:review]}\n#{line}"
end

def end_program
  exit
end

def exception
  puts "入力された値は無効な値です"
end

posts = []

while true do

    puts "レビュー数 : #{posts.length}"
    puts "[0]レビューを書く"
    puts "[1]レビューを読む"
    puts "[2]アプリを終了する"
    input = gets.to_i

    if input == 0
        posts = post_review(posts)
    elsif input == 1
        read_reviews(posts)
    elsif input == 2
        end_program
    else
        exception
    end
end

途中まで考えたコードはこちらです。

class Review
  attr_accessor :genre, :title, :voice
  @@post = []

  def self.input
    puts "ジャンルを入力してください"
    genre = gets.chomp
    puts "タイトルを入力してください"
    title = gets.chomp
    puts "感想を入力してください"
    voice = gets.chomp
    line = "-------------------------------"

    review = Review.new(genre, title, voice)
    @@post << review
  end

  def initialize(genre, title, voice)
    @genre = genre
    @title = title
    @voice = voice
  end
end

Review.input

Rubyについてあまり理解できていないため、正解のコードを知って逆から理解していきたいとおもっています。
よろしくおねがいします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

賛否両論あるかもしれませんが、書き直してみました

class Review
  attr_accessor :genre, :title, :review
  def initialize( genre:, title:, review:)
    @genre  = genre
    @title  = title
    @review = review
  end
end

module ReviewInterface
  class << self
    attr_accessor :reviews
    def reviews
      @reviews ||= []
    end

    def post_review
      puts "ジャンルを入力してください"
      genre = gets.chomp
      puts "タイトルを入力してください"
      title = gets.chomp
      puts "感想を入力してください"
      review = gets.chomp

      review = Review.new(genre: genre, title: title, review: review)

      show_review(review)

      reviews << review
    end

    def read_review
      if reviews.empty?
        puts "まだレビューがありません"
        return
      end

      show_reviews

      puts "\nみたいレビューの番号を入力してください :"
      index = Integer(gets)

      show_review(reviews[index])
    rescue
      puts "不正な番号が指定されました"
    end

    def show_reviews
      reviews.each_with_index do |review, i|
        puts "[#{i}] : #{review.title}のレビュー"
      end
    end

    def show_review(review)
      line = "-------------------------------"
      puts "ジャンル : #{review.genre}\n#{line}"
      puts "タイトル : #{review.title}\n#{line}"
      puts "感想 : \n #{review.review}\n#{line}"
    end 

    def start
      loop do
        show_menu

        input = Integer(gets) rescue -1

        act_menu(input)
      end
    end

    def show_menu
      puts "レビュー数 : #{reviews.length}"
      puts "[0]レビューを書く"
      puts "[1]レビューを読む"
      puts "[2]アプリを終了する"
    end

    def act_menu(input)
      if input == 0
        post_review
      elsif input == 1
        read_review
      elsif input == 2
        exit
      else
        puts "入力された値は無効な値です"
      end
    end
  end
end

ReviewInterface.start

※エラー処理を少し追加してます

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/30 22:24

    0のレビューを書くを実行すると下記のエラーが出てしまいます・・・。
    27:in `post_review': undefined method `show_review' for ReviewInterface:Module (NoMethodError)
    これは27行目で48行目のインスタンスメソッドを呼び出しているから起こるものでしょうか・・・?

    キャンセル

  • 2016/12/31 00:39

    show_reviewのメソッドが抜けてました。すいません。
    ソースは編集したので、再度コピーしてもらうと動くと思います

    キャンセル

  • 2016/12/31 08:59

    ありあとうございます。
    私の知らない表現がたくさんでてきていて、勉強になります!
    satoshihさんが作っていただいたコードを分析して、理解できるように励みます。

    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7017questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。