2012-12-11 20 views
7

Piszę aplikację Rails.Coffeescript dostęp do current_user

W CoffeeScript chciałbym uzyskać dostęp do current_user wraz z jego relacją do pracownika.

Jest to kod Próbuję:

$.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 

Ale konsola pokazuje - Uncaught ReferenceError: current_user nie jest zdefiniowana

Z góry dzięki za pomoc!

Odpowiedz

1

Sugerowałbym użycie gem 'gon', który jest przydatny do przekazywania danych z ruby ​​do kawy w aplikacjach szyn. Oto the Railscast o użyciu gon, a to jest repository of 'Gon'.

+0

Gon będzie działać. Ale oglądając railscast, zobaczyłem, że mógłbym użyć elementu div <% = content_tag ", id:" calendar ", data: {employeeid: current_user.employee.id} do%> – Reddirt

+0

Uważam, że' dane' działa tylko w HTML5. –

2

Zgaduję, że current_user w tym kontekście jest wartością Ruby, do której próbujesz uzyskać dostęp (zmienną instancji kontrolera lub, w oparciu o nazwę, prawdopodobnie metodą Devise, która zwraca bieżący obiekt użytkownika). Nie będzie to widoczne w JavaScript/CoffeeScript. Możesz ustawić go w widoku (np. ERB), a następnie uzyskać do niego dostęp w innych funkcjach JavaScript.

Zapoznaj się z this other Stack Overflow question, aby uzyskać kilka dobrych wskazówek, jak to zrobić, w tym link do odcinka Railscast.

Krótka odpowiedź jest taka, że ​​prawdopodobnie będziesz chciał coś takiego w szablonie ERB:

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

pamiętać, że nie można po prostu przypisać current_user do zmiennej JavaScript, a następnie wywołać metody na które z JS ; to po prostu nie działa w ten sposób. Nie można uzyskać dostępu do wartości Ruby/Rails w JS; musisz przechowywać wartości, które JS rozumie (skalary, JSON, cokolwiek).

+0

To nie działa, ponieważ zasoby są prekompilowane ** zanim ** uzyskasz dostęp do 'employee_id' w pliku coffescript, więc otrzymujesz' niezdefiniowaną zmienną lokalną lub metodę employee_id'' ... – prograils

6

Jeśli piszesz coffeescript wewnątrz szyny rurociągu aktywów (co wierzę to zrobić) nie może dostęp current_user w ogóle jesteś . Problem polega na tym, że zasoby są prekompilowane raz, kiedy wdrażasz do prod env (lub pierwszego dostępu w dev env). Wszystkie kolejne żądania po prostu łączą się z prekompilowanym pakietem js. Tak więc kod js jest taki sam dla wszystkich żądań. Z drugiej strony, current_user jest specyficzne dla każdego żądania. Tak więc, aby uzyskać dostęp do current_user z kodu potoku potok js, musisz zażądać go z określonej metody api serwera za pośrednictwem jakiegoś wywołania ajax.

Inną możliwą opcją jest pisanie coffeescript jako szablon widoku akcji kontrolera. W takim przypadku powinieneś dodać preprocesor .erb. Dostaniesz jak plik app/views/controller_name/action_name.js.coffee.erb z

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

nadzieję, że to pomoże

+0

To ciekawe - ja nie wiesz, że możesz dodać erb do coffeescript. – Reddirt

+1

możesz dodać .erb do * cokolwiek *. Czyniąc to, przeczytaj formularz rozszerzeń od prawej do lewej: plik mój_plik.js.coffee.erb to plik erb, który wygeneruje plik kawy, który wygeneruje plik js, który zostanie przesłany do klienta. – almathie

0

Proponuję 3 opcje. Ale wszystkie z nich nie są bezpieczne:

  1. Niektóre wywołania AJAX z kawy na serwer (nie próbowałem go).
  2. Renderowanie user_id jako atrybutu znacznika w widoku HTML, a następnie jego nabycie za pośrednictwem jQuery w pliku kawy.Zobacz 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. Ustawianie user_id w zwykłym pliku cookie na procedury logowania i czytania to ciasteczko od wewnątrz kawy plik jako JS zadzwoń pod numer document.cookie. Jeśli używasz opracowanie, wdrożenie Warden hak jak tutaj: https://rubytutorial.io/actioncable-devise-authentication/

app/config/inicjalizatory/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"); 
Powiązane problemy