首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Vue.js修复Ruby on Rails中的“不工作的Turbolinks重定向”

如何用Vue.js修复Ruby on Rails中的“不工作的Turbolinks重定向”
EN

Stack Overflow用户
提问于 2019-01-14 17:00:11
回答 1查看 298关注 0票数 0

在我的登录页面上,没有通过Turbolinks重定向。

此页使用表单进行登录。在发布表单正确信息后,浏览器最终转到原始页面。

我正在用Ruby on RailsVue.js实现登录页面。

在加载时,我使用Turbolinks,所以我也做了Vue.js插件vue-turbolinks

Rails: 5.2.2

拼音: 2.5.1

Turbolinks: 5

vue-turbolinks: 2.0.4

webpacker: 3.5

user_controller.rb

代码语言:javascript
复制
# coding: utf-8
class UsersController < ApplicationController

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "registing user data"
      redirect_to '/'
    else
      flash[:danger] = "invalid info"
      redirect_to '/signup'
    end
  end

  private
    def user_params
      params.require(:user).permit(:user_name, :email, :password, :password_confirmation)
    end

new.html.erb

代码语言:javascript
复制
<h1>Add</h1>
</div>
<%= javascript_pack_tag 'new' %>
<div>

new.vue

代码语言:javascript
复制
<template>
  <form accept-charset="UTF-8">
    <input type="text" v-model="username" placeholder="username">
    <input type="text" v-model="email" placeholder="email">
    <input type="password" v-model="password" placeholder="password">
    <input type="password" v-model="password_confirm" placeholder="password(confirm)">
    <button type="submit" v-on:click="sendForm">send</button>
  </form>
</template>

<script>
import axios from 'axios';

const token = document.getElementsByName("csrf-token")[0].getAttribute("content");
axios.defaults.headers.common["X-CSRF-Token"] = token;
axios.defaults.headers.common["Content-Type"] = "application/json";
axios.defaults.headers.common["charset"] = "utf-8";
axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";

export default {
  data: function() {
    return {
      username: "",
      email: "",
      password: "",
      password_confirm: ""
    }
  },
  methods: {
    sendForm: function(e){
      axios.post("/signup", {
        "user": {
          "user_name": this.username,
          "email": this.email,
          "password": this.password,
          "password_confirmation": this.password_confirm,
        }
      })
      .then(response => { 
      })
      .catch(response => {
      });
    }
  }
}
</script>

new.js

代码语言:javascript
复制
import Vue from 'vue';
import New from '../new.vue';
import TurbolinksAdapter from 'vue-turbolinks';

Vue.use(TurbolinksAdapter);

document.addEventListener('turbolinks:load', () => {
    const el = document.body.appendChild(document.createElement('new'));
    const new_ = new Vue({
        el,
        render: h => h(New)
    });

    console.log('/new page');
});

我期望在加载后,浏览器转到正确注册的根页面。

EN

回答 1

Stack Overflow用户

发布于 2019-12-03 22:30:48

/vueturbo.js

代码语言:javascript
复制
 if (typeof(Vueturbo) === 'undefined') {
       Vueturbo = {};
    }

    Vueturbo.Dispatcher = function() {
       this.dispatch = function() {
          var elements = $('.sjs');
          var cls, meth;

          $(elements).each(function (index, element) {
             tokens  = $(element).attr('data-cls').split('.');
             meth    = $(element).attr('data-method') || 'fire';
             context = window;

             $(tokens).each(function(tidx, token) {
                context = context[token];
             });

             cls = new (context)();
             cls[meth]();
          });
       };

       this.turbolinks = function() {
          var ref = this;
          document.addEventListener('turbolinks:load', function() {
            ref.dispatch();
          });
       };
    };

将标记和调度程序调用插入到模板中../views/layout/public.html.erb

代码语言:javascript
复制
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
<script charset="utf-8">(new Vueturbo.Dispatcher()).turbolinks();</script>
...
<%= yield %>
...

插入调用所需js的标记../views/public/new.html.erb

代码语言:javascript
复制
<%= hidden_field_tag nil, 'new', class: 'sjs', 'data-cls': 'Vueturbo.new' %>

/new.js

代码语言:javascript
复制
import Vue from 'vue';
import New from '../new.vue';
import TurbolinksAdapter from 'vue-turbolinks';

Vue.use(TurbolinksAdapter);

Vueturbo.new = function() {
  this.fire = function() {
    const el = document.body.appendChild(document.createElement('new'));
    const new_ = new Vue({
        el,
        render: h => h(New)
    });
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54178315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档