我写了以下表格:
<% remote_form_for :login,
:url => {:controller => :usuarios, :action => :login },
:html => { :multipart => true } do |f| %>
<p class="login_field">
Login:<br />
<%= f.text_field 'login' %>
</p>
<p class="login_field">
Clave:<br />
<%= f.password_field 'clave' %>
</p>
<br />
<p align ="right">
<%= f.submit 'Ingresar' %>
</p>
<p class="forgot">
<%= link_to "Olvidó su clave?", { :controller => 'usuarios', :action => 'olvido_contrasena', :login => }, :post => true %>
</p>
<br />
<p id="error_msg_login"></p>
<% end %>
现在,在我的控制器中我有:
def olvido_contrasena
if request.post?
u= Usuario.find_by_login(params[:login][:login])
puts u.email
if u and u.enviar_nueva_clave
flash[:message] = "Una nueva clave ha sido enviada a su correo electronico."
redirect_to :action=>'login'
else
flash[:warning] = "No se pudo enviar la nueva clave."
puts "fail"
redirect_to "/admin_main"
end
end
end
但是,我有两个问题:
我可以在这做什么?
谢谢!
我通过在用户点击“忘记密码”链接后添加带有新表单的新视图解决了我的问题。 EASIEST和CLEANEST解决方案。
答案 0 :(得分:1)
基本上 -
您点击了链接,该链接未提交您创建的表单,但“提交”按钮可以提交。
当您点击链接时,这是发送GET请求。如果您想发送带有表单数据的帖子请求,您可以使用javascript事件监听器点击链接提交表单。
由于表单未提交,您登录[login]为nil。
要使用javascript提交表单,您将使用jquery -
执行此类操作$(".linkClass").click(function(event){
event.preventDefault(); //This will stop get request.
$("#formId").submit();
})
答案 1 :(得分:1)
在您的示例代码中,登录值实际上是空的:
<%= link_to "Olvidó su clave?", { :controller => 'usuarios', :action => 'olvido_contrasena', :login => }, :post => true %>
另外 - “post =&gt; true”不是如何将其变为POST形式。
通常你会使用button_to(而不是link_to)但是因为你已经在一个表单中(并且表单没有嵌套),你可以通过传递查询字符串参数伪造帖子属性“_method”(是的,它以一个下划线开头)。所以你的榜样将成为:
<%= link_to "Olvidó su clave?", { :controller => 'usuarios', :action => 'olvido_contrasena', :login => @usario.login, "_method" => 'post'} %>
现在的问题是此人尚未登录...因此您无法获得“登录” - 并且链接上方的登录字段不是链接的一部分。因此,当有人在字段中输入内容时,您可能需要添加一些时髦的javascript来更新链接字段值。
...但是当你还没有输入任何东西时,你的控制器动作应该也处理这种情况。例如,如果params [:login]是空白的。它应该呈现“忘记密码?在这里输入您的登录名”页面。