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

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

ただいまの
回答率

90.35%

  • HTML

    12598questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Ruby

    10217questions

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

  • Ruby on Rails

    9557questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • HTML5

    5626questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • Ruby on Rails 5

    3779questions

rails: rubyで書いたコードをhtml.erbに表示させたい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 372
退会済みユーザー

退会済みユーザー

実現したいこと

gemのカレンダーを使わずにオリジナルでカレンダーを実装しています。
文献を参考にしながらなんとかrubyでカレンダーを作りました。
がしかし、rubyで書いたコードをどうhtml.erbに反映させるかが分かりません。
一応.rubyで記述した配列のデータをhtml.erbには表示することまではできます。
お分かりの方いましたらご教授願います。

class BookingController < ApplicationController
  def top
    @posts = [
      "今日からRailsの勉強するよー!",
      "カレンダーページ作成中!"
    ]

    month_table = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

    require "date"
    today = Date.today

    #うるう年か?
    is_uruu = ->(year) {
      (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
    }

    #西暦1年1月1日から何日目か(すべてグレゴリオ暦で計算)
    days = ->(year, month, day) {
      uruu = ->(y) {
        y / 4 - y / 100 + y / 400
      }
      month_days = ->{
        month_table[0, month].inject(&:+) + (is_uruu.(year) && month > 2 ? 1 : 0)
      }
      y1 = year - 1
      y1 * 365 + uruu.(y1) + month_days.() + day - 1
    }

    #曜日の計算
    week_number = ->(year, month, day) {
      (days.(year, month, day) + 1) % 7
    }

    #カレンダーの出力
    Calender = ->(year, month) {
      gen = ->(from, to) {
        (from..to).map {|i| sprintf("%2d  ", i)}.join
      }
      putout = ->(i) {
        last = month_table[month]
        last += 1 if is_uruu.(year) and month == 2
        while i + 6 <= last
          puts gen.(i, i + 6)
          i += 7
        end
        st = gen.(i, last)
        puts st unless st.empty?
      }
      puts "#{year}/#{month}".center(27)
      puts "sun mon tue wed thu fri sat"
      w = week_number.(year, month, 1)
      puts "    " * w + gen.(1, 7 - w)
      putout.(8 - w)
    }
  end
end
<h1>Booking#top</h1>
<p>Find me in app/views/booking/top.html.erb</p>
<% @posts.each do |post| %>
<%= post %>
<% end %>

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

ruby コードでは puts で出力してます。
erb では、html 用の形式で出力する必要があります。
以下のようなコードを調査して、ruby でのデータ生成ロジックと出力組み立てロジックを
どのようにするかをきめて、構成しなおしてみてください。

参考情報

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+1

このBookingControllerのコードですが、JavaScriptのようにLambda(Rubyでは->(){...}で作られるオブジェクト)を多用しているのはさすがにRubyでは分かりにくくなる気がしますね…。

素直にapp/models/calendar.rbとかにCalendarクラスを作って、uruuとかdaysとはかCalendarクラスのメソッドとして実装してみるのをおすすめします。Calendarクラスにしてみた例は後ろに書いておきます。

その上で、コントローラからビューに情報を渡すには、@postsと同様に、インスタンス変数を使うことになるでしょう。

### app/controllers/boking_controller.rb

class BookingController < ApplicationController
  def top
# 略
    today = Date.today
    @calendar = Calendar.new(today.year, today.month).to_s
# 略
  end
end

### app/views/top/index.html.erb

<h1>Booking#top</h1>
<p>Find me in app/views/booking/top.html.erb</p>
<% @posts.each do |post| %>
<%= post %>
<% end %>

<pre>
<%= @calendar %>
</pre>

もっとも、ここで<pre>でくくっているように、これだけだとただの文字列として表現されているので、タグを生成しないといけません。おそらくは<table><tr><th><td>あたりを使うことになるかと思います。具体的なやり方は、katoyさんの紹介されている記事などを参考にするとよいでしょう。下のCalendarクラスを使うとすると、to_sメソッドに加えて、HTMLとして生成するto_htmlメソッドを実装してみるとよさそうです。


Calendarクラスの例

もう少し手を入れた方が良さそうですが、元のコードとかけ離れてしまっても分かりにくいかと思うので、あまり変えずにクラス化しました。

require "date"

class Calendar
  ## month_tableは共通で使うので定数にしています
  MONTH_TABLE = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

  # コンストラクタ
  def initialize(year, month)
    @year = year
    @month = month
  end

  #うるう年か?
  ## Rubyでは真偽値を返すメソッドは`is_xxx`ではなく`xxx?`という命名にする場合が多いです
  def uruu?(year)
    (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
  end

  def uruu(y)
    y / 4 - y / 100 + y / 400
  end

  #西暦1年1月1日から何日目か(すべてグレゴリオ暦で計算)
  def days(year, month, day)
    month_days = MONTH_TABLE[0, month].inject(&:+) + (uruu?(year) && month > 2 ? 1 : 0)
    y1 = year - 1
    y1 * 365 + uruu(y1) + month_days + day - 1
  end

  #曜日の計算
  def week_number(year, month, day)
    (days(year, month, day) + 1) % 7
  end

  def gen(from, to)
    (from..to).map {|i| sprintf("%2d  ", i)}.join
  end

  def putout(i, year, month)
    buf = ""
    last = MONTH_TABLE[month]
    last += 1 if uruu?(year) and month == 2
    while i + 6 <= last
      buf << gen(i, i + 6) + "\n"
      i += 7
    end
    st = gen(i, last)
    buf << st + "\n" unless st.empty?
    buf
  end

  #カレンダーの出力
  def to_s
    buf = ""
    buf << "#{@year}/#{@month}".center(27) + "\n"
    buf << "sun mon tue wed thu fri sat" + "\n"
    w = week_number(@year, @month, 1)
    buf << "    " * w + gen(1, 7 - w) + "\n"
    buf << putout(8 - w, @year, @month) + "\n"
    buf
  end
end

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/15 19:35 編集

    ご教示していただいたコードをそのまま実行してviewに表示させることまでできました。
    お聞きしたいことがあるのですが、日にちと曜日が一致していない箇所はコードが原因なのでしょうか?

    キャンセル

  • 2018/12/15 20:06

    うーん、そこまで細かく見てないのでなんとも。
    ちなみにRubyで年月日から曜日を得るには、Date#wdayを使った方が早そうなので、私ならweek_numberの実装にはこちらを使うかと思います。
    https://docs.ruby-lang.org/ja/latest/method/Date/i/wday.html

    キャンセル

0

言語に関係なくフレームワークの使い方になってくると思うんですがキーワードとしては「rails view 変数 受け渡し」かなあと。
コントローラで定義した変数を対象のビューファイル(Railsの場合は.erb)に渡すやり方をお求めだと思うので。

あと「このビューにしか使わない」のであればビューに直接処理を書くやり方もあるはずなので、そこは要件とやり易い方で。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • HTML

    12598questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Ruby

    10217questions

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

  • Ruby on Rails

    9557questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • HTML5

    5626questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • Ruby on Rails 5

    3779questions