2015-11-22 55 views
3

我們正在使用Trailblazer構建Rails4應用程序。我之前從未和Trailblazer合作過,我對如何做事感到困惑。在Rails4中,使用Trailblazer,我如何訪問current_user

我們正在建設一個拍賣網站。我以前使用傳統控制器,以及這條路線終點是工作的罰款:

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,使用申述類。

所以在routes.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://localhost: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在我的傳統控制器的存在是因爲我們建立了設計,因此我的傳統控制器繼承它:

class ChargesController < SecuredController 

但是有什麼辦法得到它開拓者代表人?

+0

如果還不算太晚,我寫了一個基於開創者的寶石,我認爲它更容易集成到現有的rails項目中,因爲我的寶石不需要您重新組織所有內容。它在:https://github.com/NullVoxPopuli/skinny_controllers – NullVoxPopuli

回答

1

希望這個答案還不算晚。

  1. 如果您可以切換到裝飾模式而不是模塊。
  2. Representsenter實際上並不需要知道,不在乎它是否從控制器或控制檯或測試中調用。它需要的只是一個哈希來構建你的json對象。因此,您可以將另一個名爲current_user_id的屬性傳遞給Representsenter,然後像您一樣在r演示者中使用它。

FYI:

如果您需要更即時響應您可以將您的問題也複製到https://gitter.im/trailblazer/chat。通常有幾個人在那裏閒逛。但是在這裏爲後人發表問題也很好。

相關問題