使用带有 VueJS2 的 Rails 5.1 API

Posted

技术标签:

【中文标题】使用带有 VueJS2 的 Rails 5.1 API【英文标题】:Use Rails 5.1 API with VueJS2 【发布时间】:2018-06-05 07:30:36 【问题描述】:

我有一个现有的 Rails 应用程序,它有一个呈现为 json 的资源。我用Postman检查了json,一切正常。

我已经使用 webpacker gem 安装了 vuejs:

gem 'webpacker', '~> 3.0'

然后:

bundle exec rails webpacker:install

接着是:

bundle exec rails webpacker:install:vue

然后我的应用中有相关的新文件。

但是我没有得到要在索引页面中呈现的数据。

index.html.rb

#other code removed
<div id="roastslist">

  <table>
    <thead>
      <tr>
        <th>Roast Name</th>
        <th>Roaster</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="roast in roasts">
        <td>roast.name</td>
        <td>roast.roaster</td>
      </tr>
    </tbody>
  </table>
</div>
#other code removed

assets/javascripts/roasts.js

var v = new Vue(
  el: '#roastslist',
  data: 
    roasts: []
  ,
  mounted: function()
    $.get('/roasts.json', function(data)
      v.roasts = data;
    )
)

【问题讨论】:

你的控制器方法是如何传递给 Vue 的? 抱歉,不能 100% 确定您的意思。对此非常陌生。我唯一添加的是format.json render index: @roasts 【参考方案1】:

这真的很简单,但遗憾的是没有记录:

    摆脱 webpacker(不必要的头痛,见下文) 使用 vue from the cdn。它已缓存,您无法使用它。 将您的 js 代码移动到模板中 将数据呈现到模板中 5(可选)当(且仅当)它发生变化时,从 json 端点更新数据

为了演示,这将是您模板中的代码(我使用 haml,它有一个 :javascript 过滤器)

:javascript
   var v = new Vue(
       el: '#roastslist',
     data: 
       roasts: "#@rosts.to_json"
     

to_json 渲染烤肉(以 json 格式),从而使它们可用于 Vue。 to_json 有很多选项(比如 :only),但如果这还不够,我会使用 rabl。

如果(以及何时)您的 js 代码过多,您可以将一些代码移到不同的文件中,或者(函数)移到资产管道中。

PS:我使用ruby2js,这将代码大小减少了大约一半(同时看起来很容易) 另外,请观看my blog,,我将在此主题上写更多内容。

【讨论】:

【参考方案2】:

不要使用 Vue 的挂载,尝试 JSON.parse 作为您的数据,如下所示:

 var element = document.getElementById('roastslist')
  if (element != null) 
    const v = new Vue(
      el: element,
      data: 
        roastslist: JSON.parse(element.dataset.rosts)
      ,
      template: "<roast-list :original_roasts='roastslist' />"
    )
  
)

然后,在你的roasts.js 中使用:

 <tr v-for="roast in original_roasts">
    <td>roast.name</td>
    <td>roast.roaster</td>
  </tr>

我将烤肉更改为 original_roasts 以表示传递的 json 对象。此外,original_roasts 可以作为 prop 数组在其他组件中使用相同的 json 数据传递。

【讨论】:

以上是关于使用带有 VueJS2 的 Rails 5.1 API的主要内容,如果未能解决你的问题,请参考以下文章

stylesheet_pack_tag 在带有 webpacker gem 的 rails 5.1 中找不到 app/javascript/src/application.css

带有 Ruby 2.5.1 控制台的 Rails 5.2.0 - `warning:` `already` 已初始化常量 FileUtils::VERSION

如何在 Webpacker 中使用 Rails Url 助手/Rails 5.1 中的 React-rails

使用 Capistrano 部署 Rails 5.1 / Webpacker 应用程序

Rails 5.1 Capistrano 使用 secrets.yml.key 部署

禁用表单按钮,直到所有字段都填写完 rails 5.1