【发布时间】:2016-04-04 04:46:19
【问题描述】:
我正在研究 Rails 4 中的 Railscast:从头开始的身份验证,尽管本教程是为 Rails 3 构建的。 因此,必须对原始教程说明进行一些更改。
教程:http://railscasts.com/episodes/250-authentication-from-scratch?autoplay=true
当前遇到错误
参数丢失或值为空:会话
想法:
- 我比较了下面的 2 个控制器。我对本教程的更改是将参数移动到 session_params 方法中。
- 我知道错误是因为发布的哈希不包含像
"session" => { }这样的哈希。但我对 Rails 的理解不够深入,无法解决。
推荐的控制器(rails 3)
def create
user = User.authenticate(params[:email], params[:password])
if user
session[:user_id] = user.id
redirect_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Invalid email or password"
render "new"
end
end
我的控制器(转换为 Rails 4)
def create
user = User.authenticate(session_params)
if user
session[:user_id] = user.id
redirect_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Invalid email or password"
render "new"
end
end
private
def session_params
params.require(:session).permit(:email, :password)
end
到目前为止,我只使用 Devise 进行身份验证,如果您能分享任何建议,请提前非常感谢。
更新
根据要求,表单发布会话
<h1>Log in</h1>
<%= form_tag sessions_path do %>
<p>
<%= label_tag :email %> <br/>
<%= text_field_tag :email, params[:email] %>
</p>
<p>
<%= label_tag :password %> <br/>
<%= password_field_tag :password %>
</p>
<p class="button"> <%= submit_tag %> </p>
<% end %>
更新 2
同时添加 user.rb 模型
class User < ActiveRecord::Base
attr_accessor :password
before_save :encrypt_password
validates_confirmation_of :password
validates_presence_of :password, :on => :create
validates_presence_of :email
validates_uniqueness_of :email
def self.authenticate(email, password)
user = find_by_email(email)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, password_salt)
user
end
end
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end
end
end
【问题讨论】:
-
你也可以发布你的form_for吗?另外,你用
gem bcrypt吗? -
添加了表单,尽管按照教程我使用的是 form_tag。是的 - 我正在使用 bcrypt。
-
路由中不需要
resources :sessions。
标签: ruby-on-rails authentication railscasts