2013-07-08 69 views
2

我正在嘗試使用我正在構建的Rails 3.2.13/Ruby 2.0.0p195應用程序使用Devise(2.2.4),這是我的新手。我關閉scoped_views是因爲我想擁有自己的用戶和管理員視圖。我創建了我自己的Users :: RegistrationsController,它似乎正在做我想做的事情。我剛剛添加了我自己的Users :: SessionsController,這是我碰到問題的地方。設計sign_in_params方法丟失

我直接從Devise :: SessionsController源中複製了幾個操作方法,作爲第一步,計劃在它們工作後修改它們(我的控制器代碼位於本文的底部)。但是當我調用'new'方法時,由於'sign_in_params'顯然未定義,所以在調用NameError時失敗。

那麼,這似乎很奇怪,因爲我從Devise :: SessionsController繼承,當我看着GitHub上的source for that時,底部受保護部分中定義了sign_in_params。所以我決定調查我的控制器是否從Devise :: SessionsController正確繼承 - 而且看起來確實如此。我可以列出所有繼承的方法,只是沒有一個遺漏的方法。所以,我最終運行下面的代碼在Rails的控制檯:

(Devise::SessionsController.new.methods - DeviseController.new.methods).each {|m| puts m} 

而且它產生以下輸出:

_one_time_conditions_valid_68? 
    _one_time_conditions_valid_72? 
    _callback_before_75 
    _one_time_conditions_valid_76? 
    new 
    create 
    destroy 
    serialize_options 
    auth_options 

如果我忽略了下劃線的方法,其餘的是所有這些方法來定義在設計:: SessionsController源 sign_in_params。我看不出有什麼我寫的東西可以刪除這個方法,我想不出還有什麼可以嘗試的。 Google對這個問題保持沉默,所以我認爲我正在做一些特別愚蠢的事情,但我無法弄清楚什麼。有什麼建議嗎?還有人可能會嘗試運行那些Rails控制檯代碼來看看他們得到了什麼?

class Users::SessionsController < Devise::SessionsController 
    prepend_before_filter :require_no_authentication, :only => [ :new, :create ] 
    prepend_before_filter :allow_params_authentication!, :only => :create 
    prepend_before_filter { request.env["devise.skip_timeout"] = true } 

    # GET /resource/sign_in 
    def new 
    self.resource = resource_class.new(sign_in_params) 
    clean_up_passwords(resource) 
    respond_with(resource, serialize_options(resource)) 
    end 

    # POST /resource/sign_in 
    def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 

end 

回答

0

我認爲你使用的代碼從設計版本兼容Rails 4的軌道3應用程序。

sign_in_params是與strong parameters一起使用的方法。在導軌4中使用的寶石。

如果在設計版本2.2上檢查控制器。 https://github.com/plataformatec/devise/blob/v2.2/app/controllers/devise/sessions_controller.rb

您會看到沒有sign_in_params方法。

檢查您正在使用的設備版本,並根據控制器中的設備版本複製代碼,而不是從github獲取最新代碼。

+0

謝謝,阿爾詹。你說得很對。 Devise Wiki鏈接到GitHub上的'master'分支似乎是比當前gem更新的版本。我甚至檢查了master分支的README,它在頂部有一個徽章,上面寫着'gem version 2.2.4',但現在你已經指出我可以明確地選擇2.2的源代碼,我可以看到你'重新正確。我認爲我檢查的'gem version 2.2.4'徽章不是指它出現的分支,而是告訴你當前的發行版本是什麼。我將不得不更好地研究GitHub告訴我什麼。 – RobJ