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

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

ただいまの
回答率

90.48%

  • Ruby

    7946questions

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

  • Ruby on Rails

    7495questions

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

gem redcarpetでのマークダウン記法が使えない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,028

Taka624

score 32

gemfilegem 'redcarpet' bundle installし、

schemafile

create_table "renewals", force: :cascade do |t|
  t.string "title"
  t.text "content"
end

上記のモデルを作成し、

application_helper.rb

def markdown(text)
        options = {
          filter_html:     true,
          hard_wrap:       true, 
          link_attributes: { rel: 'nofollow', target: "_blank" },
          space_after_headers: true, 
          fenced_code_blocks: true
        }

        extensions = {
          autolink:           true,
          superscript:        true,
          disable_indented_code_blocks: true
        }

        renderer = Redcarpet::Render::HTML.new(options)
        markdown = Redcarpet::Markdown.new(renderer, extensions)

        markdown.render(text).html_safe
end

というようにヘルパーに記述し、

renewals_controller.rbに

class RenewalsController < ApplicationController

  def index
    @renewal = Renewal.all
  end
  def new
    @renewal = Renewal.new
  end
  def create
    @renewal = Renewal.create(renewal_params)
    redirect_to action: 'show', id: @renewal.id
  end
  def show
    @renewal = Renewal.find(params[:id])
  end
  def edit
    @renewal = Renewal.find(params[:id])
  end
  def update
    @renewal = Renewal.find(params[:id])
    @renewal.update_attributes(renewal_params)
    redirect_to action: 'show', id: @renewal.id
  end

  private
  def renewal_params
    params.require(:renewal).permit(:title, :content)
  end

end

のように記述し、

views/renewals/show.html.erbに

<h1><%= @renewal.title %></h1>
<p><%= markdown(@renewal.content) %></p>
<%= link_to "ニュース一覧に戻る", renewals_path %>

と書いています。
renewlas/newページでマークダウン記法を用いたtextを入力して、showページで見ようとすると、出力がされないようです。

なにか特別な処理が必要でしたでしょうか。

ルーティングは、
  resources :renewals の記述のみでや新規の記事作成、編集、一覧表示、個々の記事ページ表示などはできており、
<%= markdown(@renewal.content) %>によって出力されるのは、マークダウンのために記入していた##などのものは覗かれたものになります。
例えば、「##マークダウン」などと入力すると、その表示は「マークダウン」となり、「##」は無視されます。

うまく出力するにはどうしたらいいでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

例えば、「##マークダウン」などと入力すると、その表示は「マークダウン」となり、「##」は無視されます。

これは無視されている訳ではなく,マークダウンが働いて,文字が強調されているのではないでしょうか。
試しに#を一つにして文字の大きさが変わらないかどうか確認してください。
こちらの環境で同じコード問題なく動作したので,もし解決しなかったら再現する手順を教えるので返信
お願いいたします。

いろいろ検証した結果optionで有効なマークダウンの動作を変えられるようですね。

その1

質問者様のコードをオプションいじって実行してみたのが以下です。

その2

実行した手順は,

  1. Gemfileに gem 'redcarpet' を追加
  2. rails g scaffold renewal title:string content:text
  3. markdown関数をapplication_helper.rbに追加
  4. テキストをフォームで保存してshowに遷移させる。

その1の実行は質問者様のコードを全くいじっていません。
なので,うまくいかないとすれば,routes.rbの設定が
一番怪しいと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/16 10:21

    ありがとうございます。
    今、試してみましたが、文字のサイズは変わりませんでした。
    ほかのマークダウン用の記述(箇条書きリストなど)も無視され、出力されるのはマークダウン用の記述を除いた普通の文字になるので、一応、何かしら反応している様子ではあるのですが、、、。
    ご教授よろしくお願いいたします。ずっとmac開いて見ておりますので手順などすぐに試させていただきます。

    キャンセル

  • 2016/04/16 14:43

    回答追記しました。

    キャンセル

  • 2016/04/16 15:56

    本当に有難うございます。
    オプションはどのようにいじられましたでしょうか?コピペいただけませんでしょうか?

    routes.rbは、resources :renewalsのみでして、こちらはscaffoldの時に生成されるものと同じな気がします。

    キャンセル

  • 2016/04/16 16:11

    そういえば、オプションは変えなくてもできているようですのであまり関係ないですよね、、、、
    gemの競合とかあるのでしょうか...

    キャンセル

  • 2016/04/16 16:20

    マークダウン用の記述(#やリスト表示の- など)が消され、それらを除いた文字だけが出力されるというというところに怪しさがあるのですが、なにか考えられる要因はございませんでしょうか?

    キャンセル

  • 2016/04/16 17:46 編集

    そうなんですね。
    binding.pry
    などは利用していますか?
    pry-rails
    というgemをインストールして,以上のコードを入れるとbinding.pryが呼ばれるときに操作を中断して変数の中身を確かめることができます。
    erbファイルにもふくめることが出来るので
    〈% binding.pry %〉
    をmarkdown関数呼び出しの前に含め@renewal.contentの中身の確認とそれをmarkdown関数の引数にしてコンソールで実行できるかどうか確かめてください。
    それでエラーが出ていれば,教えてください。正常に実行出来たらそこで返ってきた文字列の値を見せてください。
    そこから何か解るかもしれません。
    バージョン問題はあるかもしれませんのでredcarpetとrubyのバージョンを調べて教えていただければと思います。。

    キャンセル

  • 2016/04/16 19:35

    pry-railsは利用しております。
    「markdown関数呼び出しの前に含め」というのは、show.html.erbで、<%= @renewal.title %>の前の行に<% binding.pry %>と加えるということでしょうか?

    また、contentの中身をコンソールで確認したところ、「##」などは入っております。

    markdownの引数にしてコンソールで実行できるか、というのは、コンソールで
    markdown(@renewal.content)ができるかということですよね?

    @renewal = Renewal.find(6)
    markdown(@renewal.content)
    とコンソールで叩いたところ、
    NoMethodError: undefined method `markdown' for main:Object
    となってしまいましてうまく行きません。

    rubyのバージョンは
    ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

    redcarpetのバージョンは
    2.2.2
    となっていました。

    キャンセル

  • 2016/04/16 21:53 編集

    私の環境では,
    ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin14.0]
    Redcarpet 3.3.4
    で実行しました。
    https://rubygems.org/gems/redcarpet/versions/3.3.4
    では最新版はruby1.9.2以上であれば大丈夫なので,redcarpetのversionをあげてみるのも一つ手かと思います。まずはこちらを試すといいと思います。
    またversion管理ツールrbenv,rvnなどを使用しているのであればrubyのversionを変更してみるのもいいかもしれません。

    >pry-railsは利用しております。
    「markdown関数呼び出しの前に含め」というのは、show.html.erbで、<%= @renewal.title %>の前の行に<% binding.pry %>と加えるということでしょうか?

    こちらその通りです。<% binding.pry %>を加えshowページにアクセスすると,serverが入力待機状態になるので,そこで,markdownメソッドが実行できるかどうかを試してください。ちなみに,helperメソッドは,viewで使わないと,実際のメソッド名で呼び出すことができません。rails cやその他のファイルで実行する場合は,(コントローラ名).helpers.(helperメソッド名)として呼び出す必要があります。なのでrails cでメソッドを確かめるには,今回はApplicationControllerのヘルパーメソッドなので,

    >ApplicationController.helpers.markdown

    と入力してhelperメソッドが存在するか確かめてください

    キャンセル

  • 2016/04/19 14:36

    ご返信遅れてしまいました!
    まず、redcarpetのバージョンを2.2.2より最新の3.3.4にあげました。
    表示の内容は以前と変わっていないのですが、ご指導の通り実行してみたところ、

    => 1: <% binding.pry %>
    2: <h1><%= @renewal.title %></h1>
    3: <p><%= markdown(@renewal.content) %></p>
    4: <%= link_to "ニュース一覧に戻る", renewals_path %>

    [1] pry(#<#<Class:0x007f2122ba2fa8>>)> @renewal.content
    => "# マークダウン動け!\r\nお願いします"
    [2] pry(#<#<Class:0x007f2122ba2fa8>>)> ApplicationController.helpers.markdown(@renewal.content)
    => "<h1>マークダウン動け!</h1>\n\n<p>お願いします</p>\n"


    のような結果が得られ、htmlタグに切り替わっていることが分かりました。

    そこで、おそらくこのhtmlタグに対するcssを指定すればスタイリングできるのかと思うのですが、
    通常は表示もtkowさんのようなスタイルに勝手になるのでしょうか?それともスタイリングはそれぞれのタグに対して自分でやるのが普通なのでしょうか?

    キャンセル

  • 2016/04/19 14:42

    今気づいたのですが、

    <p><%= markdown(@renewal.content) %></p>

    のようにpタグで囲っていたのがいけないのかと思い、消して
    <%= markdown(@renewal.content) %>
    にしてみたのですが、結果は同じでした。

    キャンセル

  • 2016/04/19 15:11

    htmlタグに変換されるのは正常な動作ですね。
    redcarpetの問題ではないみたいです。h1タグは普通デフォルトでブラウザでスタイルが当てられているタグなので,自分でスタイルを当ててるとかでなければブラウザの問題かもしれませんね。念のためブラウザのデバッグツールでDOMに当たっているスタイルを確認してください。
    普通はuser agent stylesheetというのがあてられているはずです。

    キャンセル

  • 2016/04/19 17:06

    developerツールで確認したところ、フロントエンドの開発者がスタイリングしやすいように、デフォルトではh1もpもすべて同じ文字のサイズになるように指定していたためこのようになっていたようです。

    原因が完全に判明でき、本当に助かりました。
    基本的な部分でつまずいていたのに何度も質問させていただいて本当に有難うございました。

    pry-byebugの使い方やApplicationController.helpers.markdownのやり方なども勉強になりこれからも有効活用していきます!
    繰り返しになりますが本当にありがとうございました!!!!

    キャンセル

  • 2016/04/19 21:03

    なるほど!解決したようで何よりです。

    キャンセル

関連した質問

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

  • Ruby

    7946questions

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

  • Ruby on Rails

    7495questions

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