铁路4强params会话

时间:2014-09-19 02:24:54

标签: ruby-on-rails session login

我正在为我的应用使用自定义无密码登录。用户只需输入他们的用户名或电子邮件,然后向他们发送带有令牌的唯一登录链接。他们以简单的形式输入用户名或电子邮件:

<%= 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]

1 个答案:

答案 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]”名称的文本字段