javascript - 使用 Backbone 将 DOM 中的文本存储到 Rails 模型中

标签 javascript ruby-on-rails backbone.js

我一直在使用 Rails4 和 Backbone.js 开发一个小型应用程序。到目前为止,我已经有了一个注册/登录系统,用户可以通过在输入字段中定义电影标题来创建他们看过的电影列表,该输入字段将电影标题存储在电影模型中并显示用户制作的电影在 View 中。

但我不喜欢用户必须重新加载页面才能看到结果,这就是为什么我想在我的项目中使用 Backbone。为此,我使用 'backbone-on-rails' gem。

到目前为止我已经创建了一个 View

class Movieseat.Views.MovieseatsIndex extends Backbone.View

  template: JST['movieseats/index']

  initialize: ->
    @render()

  render: ->
    @$el.html @template()

  events: -> 
    "click li": "showtext"

  showtext: (e) ->
    movietitle = $(e.target).text()
    console.log  movietitle

  el: "#container"

渲染模板,

<ul id="movie-overview">
    <li class="movietitle">Star Wars 1</li>
    <li class="movietitle">Star Wars 2</li>
    <li class="movietitle">Star Wars 3</li>
    <li class="movietitle">Star Wars 4</li>
    <li class="movietitle">Star Wars 5</li>
    <li class="movietitle">Star Wars 6</li>
    <li class="movietitle">Star Wars 7</li>
</ul>

<div>Not star wars</div>

在我的主页

:javascript 
  $(function() { 
    new Movieseat.Views.MovieseatsIndex
  });

#container

正如您所看到的,该 View 在 li 元素上有一个单击事件。当发生这种情况时,它会在控制台中显示该 li 元素中的文本。

我想要做的是将 li(控制台输出)中的文本保存到我的 Rails Movie 模型中。我看过RailsCast但他使用的是表单,而我找不到有关如何将文本保存到我的 Rails 模型中的示例。什么样的事件可以做到这一点?我是否需要使用集合和模型来实现这种动态?

最佳答案

首先我建议您使用MarionetteBackbone这将为您的应用程序及其模块/子模块提供良好的结构。

<小时/>

对于当前状态下的问题,您可以使用 Backbone.Model 与后端 (Rails) 交互。

1. 如果您需要所有 CRUD 动词或仅使用 POST 方法的一条路由,则需要创建电影资源。 为了节省时间,只需使用脚手架生成器生成资源即可。 在控制台中输入rails gscaffold movie title:stringuration:integer lang:string

这将为您生成所有需要的文件( Controller 、 View 、模型)以及适当的 CRUD 操作。在你的routes.rb中你会看到类似的内容:

routes.rb

YourApplicationName::Application.routes.draw do
  resources :movies
  # A lot of other routes including root
end

使用rake db:migrate运行迁移后。后端准备就绪!

现在在您的前端 javascript 源代码中添加新的主干模型:

var  MovieModel = Backbone.Model.extend({
    urlRoot: 'domain_path.com/movies', 
    defaults: {
       title: '', 
       duration: '',
       lang: ''
    } 
});

并在您的showtext方法中:

showText: function(e) {
    var movie_title = $(e.target).text()
    movie = new MovieModel();
    movie.set('title', movie_title);
    movie.save();  
}

这里 movie.save() 将触发对 /moviesPOST 请求,这将创建带有标题的新电影模型。这是解决您的问题的最简单的解决方案。并且一定要在ajax header 中设置authenticity_token,否则rails会抛出错误(但它可能包含在您使用的gem中,我没有使用它)。 Here关于它的好帖子。

请尝试让我知道它是否有效。

关于javascript - 使用 Backbone 将 DOM 中的文本存储到 Rails 模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26413727/

相关文章:

ruby-on-rails - Ruby 中的异常处理 - 如果需要救援,则调用 begin

ruby-on-rails - 设计 Ahoy 跟踪链接访问

javascript - 如何在 BackboneJS 中显示模型属性的选择列表(下拉列表)?

backbone.js - 主干验证功能没有被调用

javascript - 删除自动完成下拉箭头

javascript - 如何将后代函数绑定(bind)到顶级父对象?

javascript - 如何在 typescript 中输入 3 参数柯里化(Currying)函数?

javascript - Firebase 处理多个自定义声明

ruby-on-rails - Ruby on Rails AJAX 文件上传

javascript - jQuery 数据 $(...).data ('foo' ) 有时会在 Backbone 应用程序中返回 undefined