Rails simple_form提交时传递自定义参数失败求助
问题解答:Devise密码重置表单传递自定义参数
这个功能并没有被弃用,问题出在你的表单代码实现细节上,我来帮你梳理清楚:
你的代码核心问题分析
你在提交按钮上额外设置了name: 'email', value: params[:email],这是画蛇添足的操作,反而会导致参数冲突:
- Devise的密码重置表单已经通过
f.input :email输入框收集邮箱信息,你在按钮上重复设置name: 'email',会让表单提交时传递两个email参数(一个来自输入框,一个来自按钮)。Rails处理这类重复参数时,可能会将其转为数组或者直接覆盖,导致Devise无法正确识别用户输入的邮箱。 - 更关键的是:如果用户在表单里修改了预填充的邮箱,按钮的
value还是初始的params[:email],这会导致提交的邮箱和用户实际输入的不一致,完全不符合你的需求。
正确的实现方式
1. 仅预填充邮箱(你的核心需求)
你已经在f.input :email里设置了input_html: { value: params[:email] },这部分是正确的,足以实现从页面参数预填充邮箱的效果。只需要移除按钮上的name和value配置即可:
%h2 Forgot your password? = simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| = f.error_notification .form-inputs = f.input :email, required: true, autofocus: true, input_html: { value: params[:email] } .form-actions = f.button :button, 'Submit', type: 'submit'
2. 传递真正的自定义参数(如果后续需要)
如果之后你需要传递除邮箱外的其他自定义参数,不要用提交按钮传递,应该用隐藏字段:
- 如果参数和Devise的resource关联:
= f.hidden_field :your_custom_param, value: 'desired_value' - 如果是独立于resource的全局参数:
= hidden_tag :global_custom_param, value: 'desired_value'
验证效果
修改后,表单提交时:
- 若用户未修改邮箱,参数会保持预填充的
params[:email]值; - 若用户修改了邮箱,参数会是用户输入的新值;
- Devise的
passwords#create动作会正确接收并处理这个邮箱参数,发送重置邮件。
内容的提问来源于stack exchange,提问作者Joanna Gaudyn
相关产品推荐
相关产品推荐

