2013-10-18 61 views
0

我有一個非常基本的登錄表單,用戶輸入他/她的名字(First Last)。爲什麼我的登錄表單不能在ruby-on-rails中工作?

下面是形式ERB代碼:

<%= form_for :current_user, url: { :controller => 'application', :action=>'current_user' } do |f| %> 
    <%= f.text_field :name, placeholder: 'First Last', :id => 'currentUser' %> 
    <%= f.submit 'Submit', :class => 'btn btn-primary' %> 
<% end %> 

這裏是行動CURRENT_USER:

def current_user 
    @current_user = User.find_by_name(params[:current_user][:name]) 
    redirect_to '/calendar' 
end 

這裏是它的路線

match 'calendar/signin', to: 'application#current_user', via: 'post' 

形式的作品,我通過在current_user操作中放置一個調試器來測試它。當我輸入params時,它返回了我輸入的用戶名,因爲它應該有。但是一旦它回到/calendar視圖@current_user再次變得未定義。我應該使用什麼而不是redirect_to '/calendar'?由於

回答

2

作爲一般規則,你應該調用redirect_to用適當的路徑方法,例如:

redirect_to calendar_path 

使用文字網址擊敗路由系統的目的。你需要追蹤並將/calendar的所有實例更改爲其他應該改變的內容。使用路由方法,您可以從實施中更改演示文稿,即面向用戶的URL。

同樣,您應該在url參數form_for中使用相同的路徑標記。通過控制器和動作來調用它是舊的做法,並不是沒有問題,因爲它使用的URL並不總是您想要的。

您的current_user方法只分配@current_user如果它被調用,並且您的表單需要提前定義@current_user。如果由於某種原因它沒有被調用,你的表單將無法工作,沒有任何對象。 :current_user是在視圖的上下文中對@current_user的引用,其中視圖自動從控制器繼承實例變量。

通常你有這樣的方法:

def load_current_user 
    @current_user = User.find_by(name: ...) 
end 

然後你觸發此加載所有的時間:

before_filter :load_current_user 

通常我創建需要登錄和一個控制器類所有「僅登錄」控制器從它繼承。這樣,你應該有理由相信你沒有沒有適當限制的頁面。

顯然,你會想跳過這在不要求登錄的網頁,例如您的會話控制器,當您登錄:

skip_before_filter :load_current_user, only: [ :new, :create ] 
+0

謝謝你,你的反應是非常豐富的。在我看來,問題是@current_user不能調用current_user方法來調用。所以,用戶信息沒有顯示的原因是我沒有調用這個方法。那麼,你會推薦什麼樣的解決方案呢?我應該把它分成兩個獨立的方法嗎? – Snubber

+0

我的建議是在'before_filter'中觸發這個方法,這樣可以保證它的設置正確。 – tadman

相關問題