2013-08-10 9 views
15

にデータを渡す:のRails:私はRailsの中に新たなんだと私は持っているコントローラではJavaScript

class PagesController < ApplicationController 
    def home 
     @temp = "Hello" 
    end 
end 

私はapplication.jsにJavaScriptコードを置く必要があることを読んだことがある(本当なら、私に教えてくれ)と私が持っている:アラートがこんにちは印刷できるように

window.onload=function(){alert("<%= j @temp %>")} 

は明らかにそのアラートの印刷は、文字列は「<% = J @temp%>」 は、どのように私はJavaScriptに変数@tempを渡すことができますか?

おかげ

+0

これらのソリューションの作業のいずれかをしましたか? – Powers

+0

[Ruby on Railsの複製可能 - コントローラから外部JavascriptアセットファイルにJavaScript変数を送信](http://stackoverflow.com/questions/2721880/ruby-on-rails-send-javascript-variable-from-controller-to) -external-javascript)、または外部Jsファイルを必要としない場合はhttp://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view –

答えて

44

は私がhow to pass Ruby objects to the client上の記事を書きました。 Ryan Bates氏はまた、優れたRailsCast on passing data to JSを持っています。

ページをロードする際に表示されませんが、Rubyで保存されたデータが含まれていますあなたのPagesControlle#ホームアクションに対応するビューにdiv要素を追加し、オブジェクト:

# views/pages_controllers/home.html.erb 
<%= content_tag :div, class: "temp_information", data: {temp: @temp} do %> 
<% end %> 

は、ページをロードしますこのdivをインクルードしてページソースを表示します。 Rubyオブジェクトは.temp_information divに格納されています。 JavaScriptオブジェクトとしてRubyのオブジェクトにアクセスするにはJavaScriptコンソールを開き:

$('.temp_information').data('temp') 

あなたはJS部分的にあなたのJSを追加する必要はありません、あなたはまた、資産のパイプラインを使用することができます。

+1

あなたの答えは私のために働いた。ありがとう! – Niyanta

5

私は同様のことをしますが、gonより簡単です。私はApplicationControllerに次のようなことがあります。私のApplicationHelper

def some_action 
    javascript_variables(user: current_user) 
end 

ような何かを、私は、私はこの

def javascript_variables(variables = nil) 
    @javascript_variables ||= {} 
    @javascript_variables.merge!(variables) and return if !variables.nil? 

    output = '' 
    padding = @javascript_variables.keys.group_by(&:size).max.first 

    @javascript_variables.each do |variable, value| 
    output << "#{variable.to_s.ljust(padding)} = #{value.to_json},\n   " 
    end 

    raw "var " + output.strip.html_safe.gsub(/\,\Z/m, ';') 
end 

のようなものを持つことができ、最終的に私のレイアウトの<head>に私は

を持つコントローラのアクション内

def javascript_variables(variables) 
    @javascript_variables ||= {} 
    @javascript_variables.merge!(variables) 
end 

<script> 
    <%= javascript_variables %> 
</script> 

これは私にこの(私のアプリケーションでは実際の例から)

<script> 
    var pageModule  = "site/index", 
     isCustomer  = false, 
     utype    = "normal", 
     isAnonymous  = true, 
     keyboardShortcuts = false, 
     pubnub   = null, 
     requestToken  = "3zj974w074ftria3j"; 
</script> 
+0

この方法はウェブサイトの攻撃に対する脆弱性を高める可能性があります – dotcomXY

+1

これは質問か声明なのかどうか分かりませんので、どのように対応するのか分かりません。 – deefour

+3

非常に多くのグローバル変数を作成すべきではありません。代わりに、単一のオブジェクトを作成し、そのプロパティとして値を格納します。 –

0

これを見てのようなものを提供します。最も簡単な方法の

http://tech.thereq.com/post/17243732577/rails-3-using-link-to-remote-true-with-jquery-ujs

一つ、あなたはコントローラのアクションで定義された変数にアクセスするためにルビータグを行うことができますjs.erbファイルを、使用することです。

コントローラーのアクションでrespond_toブロックを使用し、javascriptに応答できるアクションを指定する必要があります。

items_controller。RB

class ItemsController < ApplicationController 

    def action 
    respond_to do |format| 
     format.js 
     #format.html {} # These are for allowing other types of formats to be responded to. 
     #format.json {} # But they are not necessary for using this js.erb way of doing things. 
    end 
    end 

end 

/views/items/action.js.erb

$(div).html('The cat has erased your page'); 
関連する問題