2014-06-24 44 views
2

在我的Rails應用程序更新另一個,我想,做一些動作的用戶在簽訂後,例如:創建一個對象,並在一個請求

  • 用戶在瀏覽該網站。他有而不是登錄。
  • 用戶在站點上創建一個新的對象。由於用戶未登錄,該對象是公開可見的。
  • 用戶現在想要使該對象保密。他點擊「製作私人」按鈕。
  • 由於他沒有登錄,網站不知道誰與私人對象關聯。它將他重定向到登錄表單。
  • 用戶登錄到他的帳戶。這使用標準的RESTful POST請求來登錄他。然後 - 這是我需要幫助的部分 - 它也更新對象以使其變爲私有。然後它將他重定向回(現在是私有的)對象視圖。

我是新來的Rails,但我的理解是,我無法從登錄控制器發送PUT請求到其他對象控制器,因爲重定向不允許您POST數據。

我想我還可以在登錄路徑(即http://example.com/login?ref=123&action=make_private)中放入一些GET變量,登錄控制器可以將其解釋爲「使ID爲123的對象成爲私人」。無論何時創建新的登錄名,登錄控制器都可以檢查這些參數是否存在,並處理該對象本身的更新。但似乎必須有更好的方法,而不是將更新操作從對象的控制器複製到登錄控制器中。

我想到的最後一個選擇是改變工作流程,以便用戶不用看見「製作私人」按鈕,而是看到「登錄進行更新」按鈕,但將這些操作分開比只需點擊一下鼠標就可以實現,所以我寧願只做最後一招。

我可以俯視嗎?什麼是正確的方式來做這樣的事情(如果有一個正確的方法)?

回答

1

我明白你在問什麼,所以我會試着讓你完成它。

在用戶點擊「使私人」的點,有一個對象,已經被創建,是否正確?假設如此,那麼當未登錄用戶重定向到登錄頁面時,只需將該對象ID與「make private」命令一起傳遞即可。這意味着你應該有像下面設置了一個param列表:object_id => "1", method => "make_private"

現在你有一個選擇,您可以更新,檢驗有效的登錄方法中的對象,你應該這樣做已經有:

if params[:object_id] && params[:method] == "make_private" 
    #make object private 
    redirect_to objects_path(params[:object_id]) 
else 
    #normal login redirect 
end 

,或者你可以在你的登錄確認方法重定向到該對象的更新方法,並從他們重定向到該對象的視圖頁面,像下面這樣:

def login_validation 
    #normal login checking 
    if params[:object_id] && params[:method] == "make_private" 
    redirect_to object_path(params[:object_id]) 
    else 
    #redirect to normal after login page 
    end 
end 

然後在你更新你會想:

def update 
    #normal update stuff 
    redirect_to objects_path(params[:object_id]) 
end 

很明顯,你需要的東西會檢測更新方法中的「make private」命令,但這不應該太難。如果您需要幫助,請點擊此處,我​​也會爲此添加說明。

更新: 如果你真的想要看到你可以將重定向路徑本身傳遞到登錄函數,然後重定向到任何登錄路徑提供。

例如你化妝專用按鈕看起來是這樣的

<%= button_to "Make Private", object_path(:id=>object_id) %>

然後,它會嘗試更新,實現了它在用戶沒有登錄,並重定向到登錄頁面,如下所示:

def update 
    if user_logged_in? 
    #do normal update stuff 
    else 
    redirect_to login_path(:redirect_path => object_path(params[:id]) 
end 

然後他們會填寫他們的正常信息,當他們點擊確認它會有一個像這樣的附加參數:

<%= button_to "Confirm", login_validation_path(<normal login params>,params[:redirect_path]) %>

然後在你的login_validation中,你會做你的正常驗證,然後重定向到你給的任何路徑。

def login_validation 
    #normal login stuffs 
    if params[:redirect_path] 
    redirect_to params[:redirect_path] 
    else 
    #normal redirect 
end 

這樣,您的登錄可以處理從多個不同位置調用,並正確地重定向到任何你想要的地方。

+0

謝謝。爲了澄清,我的理解是,要發送到更新操作,您需要發送一個PUT請求,而我認爲您可以通過redirect_to來做這件事。我誤解了嗎? – user108338

+0

@ user108338是的。你可以通過redirect_to使用PUT請求沒問題。您只需確保接收到PUT呈現或重定向到其他地方的視圖,因爲大多數更新都沒有附加的ERB文件。 – MCBama

0

您可以通過實現它簡單地更新你在哪裏創建用戶動作裏面你的對象,但你必須送你的對象ID您創建行動這樣你就可以更新對象,使它是私人的。

def create 
    @user = User.new user_params 
    if @user.save 
    @object = Object.find(params[:object_id]) 
    @object.update_attributes(:private => true) 
    else 
    render new 
    end 
end 

您也可以使用Active記錄after_create callback

class User < ActiveRecord::Base 
    after_create :update_object 

    def update_object 
    #your logic to update object 
    end 
end 

更新:

如果你想在那麼一個用戶登錄後,更新你的對象,你可以這樣做:

一個。創建你的路由器發送POST請求,這樣就可以把你的對象ID

post '/object/:id' => "your_controller#update_object", as: 'update_object' 

灣讓你的鏈接更新對象

<%= link_to "object", update_object_path(@object.id), method: :post %> 

℃。在你方法更新你的對象:

def update_object 
    @object = Object.find(params[:id]) 
    @object.update_attributes(:private => true) 
    redirect_to your_path, notice: "object made private" 
end 

如果你是使用設計進行身份驗證,那麼你可以通過current_user得到你的用戶,如果您有您的自定義身份驗證,然後你可以找到一個方法你當前用戶

class ApplicationController < ActionController::Base 
    def current_user 
    @current_user ||= User.find(session[:user_id]) 
    end 
end 
+0

我不認爲用戶正在創建。 – DickieBoy

+0

@DickieBoy如果你看看他的頭銜'創建一個對象,並更新另一個在一個request' – Mandeep

+0

@DickieBoy會更新我的答案在更新對象一旦用戶登錄。 – Mandeep