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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

3083閲覧

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

Taka624

総合スコア40

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2016/04/15 08:38

編集2016/04/16 01:26

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) %>によって出力されるのは、マークダウンのために記入していた##などのものは覗かれたものになります。
例えば、「##マークダウン」などと入力すると、その表示は「マークダウン」となり、「##」は無視されます。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

いろいろ検証した結果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/15 15:30

編集2016/04/16 05:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taka624

2016/04/16 01:21

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

退会済みユーザー

2016/04/16 05:43

回答追記しました。
Taka624

2016/04/16 06:56

本当に有難うございます。 オプションはどのようにいじられましたでしょうか?コピペいただけませんでしょうか? routes.rbは、resources :renewalsのみでして、こちらはscaffoldの時に生成されるものと同じな気がします。
Taka624

2016/04/16 07:11

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

2016/04/16 07:20

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

退会済みユーザー

2016/04/16 08:52 編集

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

2016/04/16 10: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 12: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メソッドが存在するか確かめてください
Taka624

2016/04/19 05: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さんのようなスタイルに勝手になるのでしょうか?それともスタイリングはそれぞれのタグに対して自分でやるのが普通なのでしょうか?
Taka624

2016/04/19 05:42

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

退会済みユーザー

2016/04/19 06:11

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

2016/04/19 08:06

developerツールで確認したところ、フロントエンドの開発者がスタイリングしやすいように、デフォルトではh1もpもすべて同じ文字のサイズになるように指定していたためこのようになっていたようです。 原因が完全に判明でき、本当に助かりました。 基本的な部分でつまずいていたのに何度も質問させていただいて本当に有難うございました。 pry-byebugの使い方やApplicationController.helpers.markdownのやり方なども勉強になりこれからも有効活用していきます! 繰り返しになりますが本当にありがとうございました!!!!
退会済みユーザー

退会済みユーザー

2016/04/19 12:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問