2017-07-15 30 views
0

我正在構建一個服務欄應用,客戶可以訂購3種不同的服務,但根據所選服務的不同,會有不同的價格和細節。使用按鈕設置cookie並顯示cookie中的值

我不想爲我的訂單製作很多表格,所以我試圖根據用戶點擊的按鈕製作一個存儲整數的不同訂購cookie,然後根據cookie值顯示訂單價格和訂單詳細信息,如週轉時間。

截至目前我嘗試存儲按鈕點擊餅乾,像這樣<%= link_to 'Package 1', controller:'order, action:'order_one'%>

在我的路線等被定義:即使我已經resources: order定義get 'order_one', to: 'order#order_one', as: 'order_one'

在我的控制器的order_one方法定義:

def order_one 
    cookies[:orderref]=1 
    redirect_to '/order' 
end 

和調用before_actioncapture_order方法是cookies[:orderref] = params[:orderref] if params[:orderref]

此刻當我點擊的按鈕order_one鏈接它只是刷新主頁,所以我不確定我在做錯誤的設置這個cookie。

編輯:爲了增加

class OrderController < ApplicationController 
 
    
 
    before_action :set_user, except: [:new, :create] 
 
    before_action :set_admin, only: [:edit, :update, :destroy] 
 
    before_action :capture_order_cookie 
 

 
    def new 
 
    @order = Order.new 
 
    
 
    #TODO: Handling the cookie's here 
 
    if cookies[:orderref] == 1 #Custom Text 
 
     #TODO: price 
 
    elsif cookies[:orderref] == 2 #Custom Text & Custom Imagery 
 

 
    elsif cookies[:orderref] == 3 #Custom Text & Custom Cartoon 
 
     #might run into a problem bc order isn't created and am trying to set price before creation, could just put price later on? 
 
    end 
 
    
 
    end 
 
    
 
    def index 
 
    #TODO: AJAX so order's disappear from view when status changes 
 
    @orders = Order.all #TODO: maybe limit this? 
 
    @orders_user = current_user.orders.where(status:2) 
 
    @orders_user_completed = current_user.orders.where(status: 4 || 5) 
 
    #Admin stuff 
 
    @orders_active = @orders.where(status: 2) 
 
    @orders_review = @orders.where(status: 3) 
 
    @orders_completed_not_paid = @orders.where(status: 4) 
 
    @orders_all_completed = @orders.where(status: 5) 
 
    
 
    end 
 
    
 
    def create 
 
    @order = Order.where(order_params).first_or_create 
 
    @order.status = 1 
 
    if @order.save 
 
     flash[:success] = "Order was successfully made" 
 
     redirect_to root_path 
 
    else 
 
     #flash error 
 
     flash[:error] = "Error making order" 
 
     render 'new' 
 
    end 
 
    end 
 
    
 
    def edit 
 
    @order = set_order 
 
    end 
 
    
 
    def update 
 
    @order = set_order 
 
    if @order.update(order_params) 
 
     flash[:success] = "Order was successfully updated" 
 
     redirect_to dashboard_path 
 
    else 
 
     flash[:error] = "Error updating" 
 
     render 'edit' 
 
    end 
 
    end 
 
    
 
    def destroy 
 
    #TODO: destroy for orders that were refunded/cancelled 
 
    end 
 
    
 
    #Accepting order & adding user_id to order 
 
    def accept 
 
    @order = set_order 
 
    if @order.user_id.present? 
 
     redirect_to root_path, flash[:error]='Order already taken' 
 
    else 
 
     @order.update(user_id: current_user.id) 
 
     @order.update(status: 2) 
 
     if @order.save 
 
     redirect_to root_path, flash[:success]='Order accepted' 
 
     else 
 
     flash[:error]='Couldn`t process your request' 
 
     end 
 
    end 
 
    end 
 
    
 
    #Submitting order for review 
 
    def submit 
 
    @order = set_order 
 
    @order.update(status: 3) 
 
    if @order.save 
 
     redirect_to dashboard_path, flash[:success]='Order submitted for review' 
 
    else 
 
     redirect_to dashboard_path, flash[:error]='Request failed' 
 
    end 
 
    end 
 
    
 
    def order_one 
 
    cookies.permanent[:orderref]=1 
 
    redirect_to '/order' 
 
    end 
 
    
 
    private 
 
    def order_params 
 
    params.require(:order).permit(:name, :company, :email, :event_type, :status, :country, :description, :user_id, :admin_comments, 
 
            :revision_comments) 
 
    end 
 
    
 
    def set_order 
 
    @order = Order.find(params[:id]) 
 
    end 
 
    
 
    def set_user 
 
    if !current_user 
 
     redirect_to root_path 
 
    end 
 
    end 
 
    
 
    def set_admin 
 
    if !current_user.admin 
 
     if current_user 
 
     redirect_to dashboard_path 
 
     end 
 
    redirect_to root_path 
 
    end 
 
    end 
 
    
 
    def capture_order_cookie #could do the IFs here? 
 
    cookies.permanent[:orderref] = params[:orderref] if params[:orderref] 
 
    end 
 
end

+0

您是否檢查並確認cookie是否被設置? –

+0

@ Md.FhanhanMemon它沒有被設置,我想知道爲什麼 – Jack

+0

嘗試'cookies.permanent [:orderref]'。 –

回答

0

根據不需要使用cookie(它們只是一個可能的解決方案,請參閱問題的評論)。我會提出一個不同的解決方案。

所以第一關你可以只通過一個查詢參數/orders/new?orderref=1(我以爲是你的意思,當你做了redirect_to '/order'給他們,因爲這是該指數動作)

<%= link_to 'Package 1', new_order_path(orderref: 1) %> 

和訪問在控制器中使用params[:orderref](這將是一個字符串),並根據它設置運動。

如果你不想這樣做,最簡單的旁邊將可能設立的路線有默認參數:

的config/routes.rb中

get 'order_one', to: 'orders#new', defaults: { orderref: 1 }, as: :order_one 
get 'order_two', to: 'orders#new', defaults: { orderref: 2 }, as: :order_two 
get 'order_three', to: 'orders#new', defaults: { orderref: 3 }, as: :order_three 

應用程序/控制器/ orders_controller。RB

def new 
    @order = Order.new 

    # TODO: setup custom pricing, etc. here 
    case params[:orderref] 
    when 1 
    @message = "Here with order 1" 
    when 2 
    @message = "Order Ref is 2" 
    when 3 
    @message = "Received the third" 
    else 
    @message = "No Order Ref received" 
    end 
end 

應用程序/視圖/命令/ new.html.erb

<%= content_tag(:small, @message) %> 

,最後你的鏈接頁面

<%= link_to 'Package 1', order_one_path %> 
<%= link_to 'Package 2', order_two_path %> 
<%= link_to 'Package 3', order_three_path %> 

現在你可以路由你的用戶/order_one,他們將通過您的new行動,同時停留在/order_one路線(instea被推入/orders/new)。

如果你想要讓他們去/orders/new,則可以改爲只使用session

的config/routes.rb中

get 'order_four', to: 'orders#order_four' 

應用程序/控制器/ orders_controller.rb

def new 
    @order = Order.new 

    case session[:orderref] 
    when 4 
    @message = "From session" 
    else 
    @message = "No Order Ref received" 
    end 

    # clear the value from the session, so it's not lingering around 
    # maybe you'll want to do this after creating an order? 
    session[:orderref] = nil if session[:orderref] 
end 

# Might need to add this to the `:except` list for `set_user` 
def order_four 
    session[:orderref] = 4 

redirect_to new_order_path 
end 

這會讓他們繼續在/orders/new而不是自定義URL,沒有查詢參數,如果這是一個要求。

+0

中呈現,感謝您的幫助。這工作! – Jack

0

正如在評論中討論,set_user方法您重定向到root_url,如果你無論如何要保存的Cookie,即使用戶沒有登錄然後將過濾器移至第一行,如

before_action :capture_order_cookie 
before_action :set_user, except: [:new, :create] 
before_action :set_admin, only: [:edit, :update, :destroy] 

此外,set_user方法不是它應該的,將其重命名爲verify_session,或者如果您正在使用設計,它有一個幫手authenticate_user

+0

當我使用'authenticate_user!'時,它不允許我使某些操作通過驗證部分。例如,我不希望用戶被要求創建訂單,但我確實需要編輯一個訂單。 – Jack

+0

好的,那只是一個建議,取決於你。上面的代碼是否修復了你的bug? –

+0

沒有抱歉,它仍然只是刷新,並沒有設置cookie。我在我的'order_one'中添加了一個puts,並且不會在控制檯 – Jack