Ruby on rails 在Rails Desive中,是否可以允许用户登录,而无需任何页面加载/重新加载?
在Rails Desive中,是否可以允许用户登录,而无需任何页面加载/重新加载Ruby on rails 在Rails Desive中,是否可以允许用户登录,而无需任何页面加载/重新加载?,ruby-on-rails,ajax,devise,Ruby On Rails,Ajax,Devise,在Rails Desive中,是否可以允许用户登录,而无需任何页面加载/重新加载 如果Desive中没有任何现成的解决方案,我认为正确的解决方法是更改远程内容html表单,以便在获取特殊参数时,它将通过ajax发送帖子,而不是使用表单提交,以防止页面加载,但允许同样有效的会话登录。这是正确的方法吗?Desive不包括现成的ajax功能,但自己添加它非常容易 1.创建自己的sessioncontroller 2.修改表单以发送JSON AJAX请求: app/views/designe/sessi
如果Desive中没有任何现成的解决方案,我认为正确的解决方法是更改远程内容html表单,以便在获取特殊参数时,它将通过ajax发送帖子,而不是使用表单提交,以防止页面加载,但允许同样有效的会话登录。这是正确的方法吗?Desive不包括现成的ajax功能,但自己添加它非常容易 1.创建自己的
sessioncontroller
2.修改表单以发送JSON AJAX请求:
app/views/designe/sessions/new.html.erb
:
<h2>Log in</h2>
<%= form_for(resource, as: resource_name, url: session_path(resource_name),
html: { id: "new_session_form",
data: {
remote: true,
type: :json
}
}
) do |f| %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<% if devise_mapping.rememberable? -%>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end -%>
<div class="actions">
<%= f.submit "Log in" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
您不会在页面上看到任何更改(警报除外),但它会在会话中设置用户id,以便对任何后续请求进行授权 没有现成的解决方案,但您可以轻松地修改您的应用程序并设计代码来实现这一点-您可以对Desive中的注册和其他功能执行相同的操作。这里一个巨大的好处是,如果javascript崩溃,它会优雅地降级,只发送一个常规表单提交。还有一个糟糕的教程建议您将JSON添加到
config.navigational_formats
——不要这样做。它破坏了Desive的几个部分,并且可能不安全。
devise_for :users, controllers: { sessions: 'sessions' }
<h2>Log in</h2>
<%= form_for(resource, as: resource_name, url: session_path(resource_name),
html: { id: "new_session_form",
data: {
remote: true,
type: :json
}
}
) do |f| %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<% if devise_mapping.rememberable? -%>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end -%>
<div class="actions">
<%= f.submit "Log in" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
// app/assets/javascripts/sessions.js
$(document).on('ajax:complete', '#new_session_form', function(e, xhr){
var user;
console.log(e, xhr);
if (xhr.statusText === "Created") {
user = xhr.responseJSON;
alert('Hello ' + user.email);
} else {
alert('Invalid email or password!');
}
});