我正在研究Hartl书籍的9.3.3并继续陷入
SessionsController的未定义方法`sign_in':0x00000100c0da90
我知道这是因为sign_in方法位于sessions_helper文件中,该文件由模型而不是控制器拾取。 Hartl书不需要“包含SessionsHelper”行。
如果我放入那个我假设我不应该进行的黑客攻击,那么它会以另一个错误登陆我:undefined方法current_user
这是代码
SessionsController.rb
class SessionsController < ApplicationController
def new
@title = "Sign in"
end
def create
user = User.authenticate( params[:session][:email],
params[:session][:password])
if user.nil?
flash.now[:error] = "Invalid email/password combo."
@title = "Sign in"
render 'new'
else
sign_in user
redirect_to user
end
end
def destroy
end
和sessions_helper.rb
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
self.current_user = user
end
答案 0 :(得分:7)
应用程序控制器中应该有“包含SessionsHelper”。默认情况下,帮助程序包含在视图中,但为了在控制器中使用帮助程序,需要显式包含它。
答案 1 :(得分:3)
如果您已经在application_controller中包含了SessionsHelper,并且仍然遇到此失败的测试错误:
如果您在之前的Ch。中的练习中更新了spec / support / utilities.rb文件。 8并使用给出的示例,您很有可能创建了“sign_in”方法,但根据第8章练习中的示例将其命名为“valid_signin”,而不是将其命名为“sign_in”。希望这可以帮助。
这也是基于第二版。该教程但仍应适用于我想象的第一个。
答案 2 :(得分:1)
另外值得补充的是,您需要注意不要被SessionsHelper模块中编写的sign_in帮助程序和spec / support / utilities.rb文件中编写的sign_in弄糊涂。同名,但有两个不同的功能。在测试中,被调用的是在utilities.rb文件中编写的那个(代码清单9.6),如下所示:
def sign_in(user)
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
#sign in when not using capybara as well
cookies[:remember_token] = user.remember_token
end
答案 3 :(得分:0)
你的ApplicationController不是必须include SessionsHelper
吗? (在书中复制9.11),然后在其中定义current_user
(列出9.14)?
答案 4 :(得分:0)
我犯的错误是我从未将utilities.rb文件放在子文件夹支持
中