Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails Desive中,是否可以允许用户登录,而无需任何页面加载/重新加载?_Ruby On Rails_Ajax_Devise - Fatal编程技术网

Ruby on rails 在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

在Rails Desive中,是否可以允许用户登录,而无需任何页面加载/重新加载


如果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!');
  }
});