【问题标题】:Rails simple_form: passing params on submitRails simple_form:在提交时传递参数
【发布时间】:2018-05-29 10:10:04
【问题描述】:

我想在用户提交表单时传递自定义参数。我找到了这个question,但我仍然没有让它工作。

这些是我在表单页面上的参数:{"email"=>"user@example.com", "controller"=>"devise/passwords", "action"=>"new"}

这是我的表格:

%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', name: 'email', value: params[:email]

这种行为是否在某个时候贬值了,还是我做错了什么? 我正在使用 ruby​​ 2.5.1 和 rails 5.2。

【问题讨论】:

  • simple_form_for(resource, as: resource_name, url: password_path(resource_name, email: params[:email]), html: {...
  • @Vasilisa 这似乎没有任何改变:我仍然在表单页面上有可用的参数,但在提交后没有。
  • 您是否从按钮中删除了名称和值?
  • @Vasilisa 我以前没有(从您的评论中并不太清楚)但现在尝试了 - 没有变化。
  • 当您单击“忘记密码”并被带到devise/passwords/new 时,您在devise/sessions/new,最初的想法是在提交电子邮件后重定向回登录(这样您就可以回到sessions/new),电子邮件已经从参数填写。

标签: ruby-on-rails ruby forms parameters simple-form


【解决方案1】:

只需声明您的密码重置后路径,以便您可以传递参数:

def after_sending_reset_password_instructions_path_for(resource_name) 
  my_path(email: resource.email)
end

如果您成功重置密码页面的路径是collection 路径,这应该可以工作。如果是member 路径,则只需添加资源,例如:

 def after_sending_reset_password_instructions_path_for(resource_name) 
   my_path(resource, email: resource.email)
 end

但我不建议使用member,因为它可能会泄露数据。

【讨论】:

  • 谢谢!这正是我所需要的。
【解决方案2】:

您在 cmets 中描述了一些参数被传递给控制器​​然后发生一些重定向的情况。所以,redirect 会触发一些不知道传递给 prev 动作的参数的新动作。

您必须手动传递该参数。例如

redirect_to resource_path(resource, email: params[:email])

但是,如果您想显示与之前相同的视图,请使用渲染而不是重定向。

【讨论】:

  • 我正在使用设计 passwords_controller 和 after_sending_reset_password_instructions_path_for 方法。我想重定向到一个静态页面,上面写着“密码重置指令已发送到 #{params[:email]}”。我尝试使用def after_sending_reset_password_instructions_path_for(resource_name) password_reset_path(email: params[:email]) end,但这似乎也没有通过参数。
  • 设计? @Maxence 已经给出了正确的答案,如何为 Devise 做到这一点。
  • 另外,如果您不想在 URL 中显示电子邮件,您可以将电子邮件保存在用户会话中,然后将其作为变量 @email = session['email']
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2010-10-16
  • 2014-06-24
相关资源
最近更新 更多