プロジェクトが大きく、大規模なJSにBackboneなどのクライアントフレームワークを使用する場合-すばらしい! 読み込みが改善され、どこでどのように動作するかが決まります。 しかし、特定のページに少量のコードを接続するだけならどうでしょうか? つまり、コントローラーではなく、アクションです。 そして、そのような断片が5を超えても、コードがスパゲッティにならないことが望ましいです。 小さなStyx gemがこれに役立ちます。
Styxは特定のアクションに対して特定のコードを呼び出すだけでなく、Rubyからデータを転送することもできます。 料理:
# Gemfile gem 'styx' # app/controllers/application_controller.rb controller class ApplicationController include Styx::Initializer end # app/views/application.html.erb <%= javascript_include_tag "application" %> <%= styx_initialize %> <%= csrf_meta_tags %>
`rails g foos 'を使用して作成したFoosControllerコントローラーがある場合は、努力によってapp / controllers / foos_controller.rbだけでなく、app / assets / javascripts / foos.js.coffeeもあります。 後者は次のようになります。
# Styx.Initializers. @Styx.Initializers.Foos = initialize: -> console.log ' action foos <head>' index: (data) -> console.log ' /foos/ <head>' show: (data) -> $ -> console.log ' ( jQuery) /foos/... (. jQuery.ready())'
すべてのメソッド(一般的な初期化を除く)がdataパラメーターを受け入れることに注意してください。 デフォルトでは、これは空のオブジェクト{}ですが、コントローラーとビューの両方でルビー側から簡単に補充できます。
# app/controllers/foos_controller.rb class ApplicationController def index styx_initialize_with :foo => 'bar', :and => {:habrahabr => 'rockz!'} end end
# app/views/foos/index.html.erb <%- styx_initialize_with :something => 'very important' %>
データを取得します。
{"foo": "bar", "and": {"habrahabar": "rocks!"}, "something": "very important"}
コードを呼び出すのに必要なことはそれだけです。 JSは単一のファイルにアセンブルされ、全体として接続されているため、クラス(Coffeeのおかげでクラス)で繰り返しコードを簡単に記述し、Initializerを使用して必要なページで呼び出すことができます。 そして素敵なボーナスとして-あなたのビューでJSにデータを転送するための「.to_json」のダンプはもうありません:)。