我正在为我的应用使用自定义无密码登录。用户只需输入他们的用户名或电子邮件,然后向他们发送带有令牌的唯一登录链接。他们以简单的形式输入用户名或电子邮件:
<%= form_tag request_token_path, id:'login-form' do %>
<%= text_field_tag :user_id %>
<% end %>
这会发布到sessions#request_token
方法,该方法会验证该用户是否存在,然后沿着登录链接发送。
def request_token
lookup = session_params[:user_id]
if lookup.include? '@'
@user = User.find_by(email: lookup)
else
@user = User.cached_find(lookup)
end
if @user
@user.send_login_link
redirect_to login_path, notice: "#{@user.username.capitalize} your email was sent!"
else
redirect_to login_path, notice: "Whoops! Looks like #{lookup} is not registered on this site. Please check spelling or signup!"
end
end
我的问题是,在我的SessionsController
文件中,我定义了sessions_params
private
def session_params
params.require(:session).permit(:user_id,:auth_token)
end
我知道这意味着我必须使用会话对象或者从表单中传递:user_id
,因为我将:user_id
定义为一个有效作为a的属性的param会话。我想知道这样做的正确方法。制作一个新的会话对象没有意义,因为这甚至不是我的模型,但从params中取出它是否安全?
而是制作lookup = params[:user_id]
?
答案 0 :(得分:1)
如果您有一个响应user_id属性的会话对象,则需要专门为该对象创建表单:
<%= form_for @session do |f| %>
<%= f.text_field :user_id %>
<% end %>
如果情况并非如此,并且您需要坚持使用form_tag,请尝试将控制器中出现的属性名称作为会话哈希:
<%= text_field_tag "session[user_id]" %>
当你这样做时
params.require(:session)
这意味着你要求你的params散列有一个会话密钥,而会话密钥又应该有允许的user_id属性:
{params: {session: {user_id: "something"}}
这就是为什么你需要form_for @session或带有建议的“session [user_id]”名称的文本字段