2016-06-13 79 views
0

我正在試驗Rails應用程序 - 我正在使用Devise進行用戶登錄,並且我正在設置它,以便每次用戶成功登錄時,一個特定的條目會自動插入名爲reports的模型中。Rails - 自動錶單提交設計登錄,undefined方法`許可'

在我的設計會話控制器,我有關於一個成功的用戶登錄以下操作:

def create 
    self.resource = warden.authenticate!(auth_options) 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with resource, location: after_sign_in_path_for(resource) 
end 

def after_sign_in_path_for(resource) 
    Report.create(report_params({"comment" => "user logged in"})) 
end 

private 
    def report_params(params) 
     params.permit(:comment) 
    end 

所以,如果這是不明確的,我的意思做的是在每次reports創建一個新條目用戶登錄,並且該條目將始終讀取「用戶登錄」。

然而,當我嘗試運行此,我得到以下錯誤:

undefined method `permit' for {"comment"=>"user logged in"}:Hash 

我知道這個確切的操作似乎有點毫無意義或冗餘 - 正如我所說,我只是嘗試,但是正確的做法可能會幫助我重新構建一個我正在開發的應用程序(考慮使用JSON代替這個固定條目)。

如果有人能解釋這個錯誤的含義,並幫助我弄清楚我做錯了什麼(或者如果這是完成這樣的任務的最佳方式),那將是非常感激。

回答

1

你不需要做這個只是在你創建操作添加此

def create 
    self.resource = warden.authenticate!(auth_options) 
    Report.create(comment: "user logged in") 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with resource, location: after_sign_in_path_for(resource) 
end 

所以屁股一旦資源被認證會有每一個sign_in之後創建一個新的報告。如果您需要更多

1

The 回答給出@Chirag Arya應該爲你工作。我將着重解釋錯誤。

undefined method `permit' for {"comment"=>"user logged in"}:Hash

的問題是permit應該叫上ActionController::Parameters,但你稱它在哈希。請注意,您使用report_params方法中的散列({"comment"=>"user logged in"})覆蓋了正常的params

h = {"comment"=>"user logged in"} 
=> {"comment"=>"user logged in"} 

h.permit 
NoMethodError: undefined method `permit' for {"comment"=>"user logged in"}:Hash 

a = ActionController::Parameters.new({"comment"=>"user logged in"}) 
=> {"comment"=>"user logged in"} 

a.permit(:comment) 
=> {"comment"=>"user logged in"} 

另外,我注意到,你是錯誤使用after_sign_in_path_for(resource),一個設計的輔助方法這是爲了服務器不同的目的。 See why this method is used