7

Railsアプリを書いています。

CoffeeScriptで、従業員との関係とともにcurrent_userにアクセスしたいと思います。

これは私が試しているコードです:

    $.create "/events/",
      event:
        title: title,
        starts_at: "" + start,
        ends_at: "" + end,
        all_day: allDay,
        hours: hours,
        employee_id: current_user.employee_id
        # pickup the current employee

しかし、コンソールには次のように表示されます-Uncaught ReferenceError:current_user is not defined

助けてくれてありがとう!

4

4 に答える 4

7

Railsアセットパイプライン内にcoffescriptを記述している場合(私はあなたがそうしていると思います)、current_userにまったくアクセスできません。ここでの問題は、prod envにデプロイするとき(またはdev envでの最初のアクセス時に)、アセットが1回プリコンパイルされることです。以降のすべてのリクエストは、プリコンパイルされたjsバンドルにリンクするだけです。したがって、jsコードはすべてのリクエストで同じです。一方、current_userはリクエストごとに固有です。したがって、アセットパイプラインのjsコードからcurrent_userにアクセスするには、ajax呼び出しを介して特定のサーバーAPIメソッドからそれをリクエストする必要があります。

他の可能なオプションは、コントローラーアクションビューテンプレートとしてコーヒースクリプトを作成することです。この場合、.erbプリプロセッサを追加する必要があります。app / views / controller_name/action_name.js.coffee.erbのようなファイルを取得します。

$.create "/event",
  event:
    employee_id: <%= current_user.employee_id %>

これがお役に立てば幸いです

于 2012-12-11T19:06:56.783 に答える
3

current_userこのコンテキストでは、アクセスしようとしているRuby値(コントローラーインスタンス変数、または名前に基づいて、現在のユーザーオブジェクトを返すDeviseメソッド)であると推測しています。これはJavaScript/CoffeeScriptでは表示されません。ビュー(ERBなど)で設定してから、他のJavaScript関数でアクセスできます。

Railscastエピソードへのリンクなど、これを行う方法に関するいくつかの良い指針については、この他のStackOverflowの質問を確認してください。

簡単に言うと、ERBテンプレートには次のようなものが必要になるでしょう。

<script>
    employee_id = <%= current_user.employee_id %>
</script>

current_userJavaScript変数に割り当てて、JSからその変数のメソッドを呼び出すことはできないことに注意してください。それはそのようには機能しません。JSではRuby/Railsの値にアクセスできません。JSが理解できる値(スカラー、JSONなど)を保存する必要があります。

于 2012-12-11T19:02:41.190 に答える
1

RailsアプリケーションでRubyからCoffeeにデータを渡すのに便利なgem'gon'を使用することをお勧めします。これがgonの使用法に関するRailscastであり、これは「Gon」のリポジトリです

于 2012-12-11T18:59:57.010 に答える
1

私は3つのオプションを提案します。しかし、それらのすべてが安全ではありません。

  1. コーヒーからサーバーへのAJAX呼び出し(私は試していません)。
  2. HTMLビューでタグの属性としてレンダリングuser_idし、コーヒーファイルでjQueryを介してタグを取得します。https://www.sitepoint.com/create-a-chat-app-with-rails-5-actioncable-and-devise/を参照してください

HTML:

<div id="user_id" data-user-id="<%= current_user.id %>">

CoffeeScript:

tag_user_id = $('#user_id')
current_user_id = tag_user_id.data('user-id')
  1. user_idログイン手順でプレーンCookieを設定し、JS呼び出しとしてコーヒーファイル内からそのCookieを読み取りますdocument.cookie。Deviseを使用する場合は、次のようにWardenフックを実装します:https ://rubytutorial.io/actioncable-devise-authentication/

app / config / initializers / warden_hooks.rb

Warden::Manager.after_set_user do |user,auth,opts|
  scope = opts[:scope]
  auth.cookies["#{scope}.id"] = user.id # not signed
end

CoffeeScipt:

current_user_id = document.cookie.replace(/(?:(?:^|.*;\s*)user.id\s*\=\s*([^;]*).*$)|^.*$/, "$1");
于 2017-04-06T09:18:15.603 に答える