50
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyの配列をSlim経由でJavascriptの配列にする方法

Last updated at Posted at 2016-01-09

railsで使うテンプレートエンジンをerbからslimに移行しようと色々試していてはまったので。

Rubyの配列をhtmlタグとして出力せず、Javascriptに変数として渡してフロントでページを組み立てたいときなど。

やりたいこと

この手のRuby配列を

hoge_controller.rb
	@test = ["大谷", "吉川", "メンドーサ"]

javascriptでこうなるように出したい

front.html
	var test = ["大谷", "吉川", "メンドーサ"];

失敗例1

まずは何も考えずにそのまま出してみる

front.html.slim
javascript:
	var test = #{@test}

結果

result
var test = ["大谷", "吉川", "メンドーサ"];

クォートがあれされたままなので当然jsでエラーが出る

失敗例2

eachを使って頑張ってみる

slim.front.html.slim
javascript:
	var test = #{@test.each do |t| "'" + t + "'" end }

結果

result
var test = ["大谷", "吉川", "メンドーサ"];

何も変わってない\(^o^)/

成功例

結論から言うと、Ruby側で加工してから出してあげれば解決します。

hoge_controller.rb
	@test = ["大谷", "吉川", "メンドーサ"]
	@test_j = @test.to_json.html_safe
front.html.slim
javascript:
	var test = #{@test_j};

結果

result
var test = ["大谷", "吉川", "メンドーサ"];

できた!!

そもそもJSを動的に生成するのってどうなのって話も出るかもしれませんが、
なんだかんだ結構やることがあるのでやり方が見つかってよかったです。
Railsは超初心者なんですが、Slimいいですねほんと。

追記

コメント欄でご指摘いただきました.

#{}を#{{}}にするとエスケープされなくなるそうです。

こちらの方がずっと良いですね。

javascript:
    var test = #{{@test.to_json}};

参考リンク

http://stackoverflow.com/questions/7561430/use-ruby-array-for-a-javascript-array-in-erb-escaping-quotes

50
28
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?