2009-10-14 57 views
1

說我有像Rails的這個(通用Q &的網站),一個網站,我想這個「問」頁面W/A文本框的第一頁用戶他看到了,即使他沒有登錄。他輸入了一個問題,在'新'方法中,我檢查他沒有登錄,並將他彈回到/ session/new,他可以登錄或創建一個新帳戶。問題是,我怎麼(以及什麼是最好的辦法)保留他最初通過這個過程所要求的那個問題?保留表單提交在/ Rails中註冊

回答

0

你把它保留在會話中。所以在登錄後,當用戶回過頭來問他的問題時,你會發現會話中已經有東西了。
你可以直接顯示它。

+0

如果數據太大而無法存儲在Cookie中,並且您將Cookie用作會話存儲,則會失敗。 – Mohamad 2012-11-26 16:23:05

+0

那麼,你可以隨時存儲一個id,然後將真實數據保存在數據庫中。但是將數據庫存儲爲會話存儲會更有效率。基本上:這就是我們使用Cookie以外的會話存儲的原因。 – 2012-11-30 17:26:13

1

我理解的問題描述的動作的流程是

  1. 用戶呈現形式
  2. 用戶重定向到登錄頁面上提交
  3. 用戶被重定向回表格成功登錄
  4. 重新填充表單上的問題(問如何做到這一步)
  5. 用戶最終提交表單。如果用戶登錄

省略步驟2-4。

我很抱歉,但我看到你的問題更多的是比導軌問題的根本UI問題的徵兆。

如果只有登錄的用戶可以發佈問題,那麼爲什麼要顯示文本框? 如果用戶要以任何方式登錄,爲什麼不先把它排除在外。更好的解決方案是集成登錄和表單。

像這樣的觀點:

<% form_for :question do |form| %> 
    <% unless logged_in? %> 
    <% fields_for :session do |session_form|%> 
     <%= session_form.label :login %> 
     <%= session_form.text_field :login %> 
     <%= session_form.label :password %> 
     <%= session_form.password_field :password %> 
    <%end%> 
    <%end%> 
    <%= form.text_area :question %> 
<%end%> 

和Controller

def new 
    ... 
    unless params[:session].nil? 
    self.current_user = User.authenticate(params[:session][:login], params[:session][:password]) 
    end 
    if logged_in? 
    flash[:notice] = "Logged in successfully" 
    else 
    flash[:error] = "Incorrect username and or password." 
    end 
    if logged_in? && @question.save 
    .... process successful entry 
    else 
    ... process unsuccessful entry 
    end 
end 

編輯:穆罕默德的提高重用跨多個控制器和形式的這種模式的問題。所以答案已經更新,以解決這種模式的重用。

爲了簡化重用,您可以將此塊放入輔助函數,該函數在before_filter中爲需要它的操作引用。

def login 
    unless params[:session].nil? 
    self.current_user = User.authenticate(params[:session][:login], params[:session][:password]) 
    if logged_in? 
     flash[:notice] = "Logged in successfully" 
    else 
     flash[:error] = "Incorrect username and or password." 
    end 
    end 
end 

爲:

before_filter :login => :only [:new , :edit, :update, :delete] 

在視圖方面,應該不會太難構建的的form_for嵌入了會話參數的新變種。也許是form_for_with_session?

至於處理不成功的響應,我會建議使用一段代碼的幫助函數。對不起,我沒有時間爲你寫出或測試一個。

+0

如果您需要跨多個控制器重複此行爲,該怎麼辦?這讓人很累,不得不將這添加到每個動作中。還有哪些其他解決方案可以解決這種情況? – Mohamad 2012-11-26 16:25:14

+0

我已經更新了答案,以便它觸及代碼重用。 – EmFi 2012-11-27 14:03:17

+0

謝謝你。值得超過+1!乾杯! – Mohamad 2012-11-27 14:21:18

0
def create 
    if current_user # Implement this method in your auth framework 
    @question = Question.new(params[:question] || session.delete[:question]) 
    # (the usual stuff you'd do to save) 
    else 
    session[:question] = params[:question] 
    redirect_to :controller => :sessions, :action => "new" 
    end 
end 

然後,在你的用戶創建和身份驗證的東西全在你登錄動作完成後,只要確保你回發到這個create行動,如果session[:question]定義。

+0

如果數據不適合Cookie,你會怎麼做? – Mohamad 2012-11-26 16:21:10