В Rails4, используя Trailblazer, как мне получить доступ к current_user

Мы создаем приложение Rails4 с использованием Trailblazer. Я никогда не работал с Trailblazer раньше, и я не понимаю, как это сделать.

Мы строим аукционный сайт. Ранее я использовал традиционный контроллер, и конечная точка маршрута работала нормально:

 def bill    
     @profile = Profile.find_by user_id: current_user_id
     @current_order = Order.order(created_at: :desc).find_by(user_id: current_user_id)
     @batch = @current_order.batch

     if @batch.nil?
       puts "There was no batch linked to the current order of #{@current_order.id}"
       flash[:error] = "We are sorry, but we could not determine which batch your order belongs to."
     else
       @price_shown_to_customer = @batch.price + ENV["FUELBID_FEE_PER_GALLON"].to_f
       @amount = @current_order.quantity * @price_shown_to_customer
     end

Но теперь я предполагаю создать это как API Trailblazer, используя класс Представитель.

Так что в rout.rb я добавил кое-что для "сборов":

 namespace :api do
   get '/price' => 'info#info'
   post '/order' => 'orders#create'
   get '/charges' => 'charges#bill'
 end

Я создал этот API, но скопировал и вставил другой:

 module Api
   class ChargesController < ApiApplicationController

     respond_to :json

     def bill
       respond_with OpenStruct.new.extend(ChargesRepresenter)
     end

   end
 end

Я проверил вышеупомянутое с простым Представителем, и все это работало отлично, так что все хорошо до этого момента. Если я возвращаю простые данные из Представителя, то я вижу это прекрасно здесь:

HTTP: // локальный: 3000 / API / charges.json

Но мне нужно получить current_user. Как это сделать? Прямо сейчас это не работает

 module ChargesRepresenter
   include Roar::JSON

   collection :price_shown_to_customer

   def price_shown_to_customer
     current_order = Order.order(created_at: :desc).find_by(user_id: current_user_id)
     puts "current_order"
     puts current_order.id
     batch = current_order.batch
     batch.price + ENV["FUELBID_FEE_PER_GALLON"].to_f  
   end
 end     

current_user_id существует в моих традиционных контроллерах, потому что мы настроили Devise, и поэтому мои традиционные контроллеры наследуют его:

  class ChargesController < SecuredController

Но есть ли способ получить его в представителе Trailblazer?

1 ответ

Надеюсь, этот ответ не слишком поздно.

  1. Если вы можете переключиться на шаблон Декоратор вместо модуля.
  2. Представителю действительно не нужно знать, и ему все равно, вызывается ли он из контроллера, из консоли или из теста. Все, что ему нужно, - это хеш, из которого вы можете построить свой объект json. Таким образом, вы можете просто передать другой атрибут с именем current_user_id вашему Представителю, а затем использовать его внутри r Presenter, как и вы.

FYI:

Если вам нужен более быстрый ответ, вы можете также скопировать свой вопрос на https://gitter.im/trailblazer/chat. Обычно там висит несколько человек. Но это также хорошо, чтобы отправить вопрос здесь для потомков.

Другие вопросы по тегам