在Rails3、jQuery和AJAX中更新变量并将其保存到数据库中(无表单)

在Rails3、jQuery和AJAX中更新变量并将其保存到数据库中(无表单),jquery,ruby,ajax,ruby-on-rails-3,model-view-controller,Jquery,Ruby,Ajax,Ruby On Rails 3,Model View Controller,我在一个网站上工作,我有一个页面,用户可以从一组截图中选择视频的封面图片。我已经将所有的图像显示在一个网格中,并且我添加了jQuery,这样用户最后点击的视频都会被“选中”,并在其周围有一个框架 我需要的帮助是将此写入数据库。我要找的是一种保存此选择的方法 这就是我现在拥有的。在视频控制器中: def cover_selected @video.cover_url = params[:selected_cover] @video.save end 这在videos/sh

我在一个网站上工作,我有一个页面,用户可以从一组截图中选择视频的封面图片。我已经将所有的图像显示在一个网格中,并且我添加了jQuery,这样用户最后点击的视频都会被“选中”,并在其周围有一个框架

我需要的帮助是将此写入数据库。我要找的是一种保存此选择的方法

这就是我现在拥有的。在视频控制器中:

  def cover_selected
    @video.cover_url = params[:selected_cover]
    @video.save
  end
这在videos/show.html.erb中:

<%= stylesheet_link_tag 'application.css' %> 
<% provide(:movie_url, @h264_encoding.url) %>
<div class="container">
<% if @original_video.status == "success" %>
  <div id="strobemediaplayback">Movie goes here!</div>
  <br/><h2>Select a cover image</h2>
  <% @h264_encoding.screenshots.each_with_index do |screenshot,i| %>
    <% if i%3 == 0 %> 
        <div class="row">
    <% end %>
    <div class="span3" style="margin-bottom:20px"><img class="screenshot" id="<%= i %>" src="<%=  screenshot %>" />
    </div>
    <% if i%3 == 2 %>
        </div>
    <% end %>
  <% end %>
<% end %>
</div>

<script>
  $(document).ready(function(){
    $('div.row img').click(function(e) {
      e.preventDefault();
      $('div.row img.selected').removeClass('selected');
      $(this).addClass('selected');
      $.ajax({
       url: '/videos/cover_selected/',
       data: { selectedCover: this.id },
      });     
    });
  });
</script>

如何更新@video的cover\u url属性?

您需要使用对服务器的异步调用(AJAX)

$('div.row img')。单击(函数(e){

e、 preventDefault();//仅供参考-仅在

中需要此选项,您需要使用对服务器的异步调用(AJAX)

$('div.row img')。单击(函数(e){

e、 preventDefault();//仅供参考-仅在

时需要此功能,您需要3个部件协同工作才能完成此操作--

1) 控制器中的操作 2) show.html.erb中相应的jQuery,以及 3) 使rails能够将传入数据发送到正确操作的路由

控制器中的操作已关闭,这将起作用:

  def cover_selected
    @video = Video.find(params[:video_id])
    @video.update_attribute(:cover_url, params[:selected_cover])
    respond_to do |format|
      format.all { render :nothing => true, :status => 200 }
    end
  end
jQuery代码还可以,但也可以进行更新,以显示您进入页面时选择的封面:

  $(document).ready(function(){
    var video_id = <%= @video.id %>;
    $('div.row img[id=<%= @video.cover_url || 0 %>]').addClass('selected');
    $('div.row img').click(function(e) {
      e.preventDefault();
      $('div.row img.selected').removeClass('selected');
      $(this).addClass('selected');
      $.ajax({
       url: '/videos/cover_selected/',
       data: { 'selected_cover': this.id,
               'video_id': video_id },
      });     
    });
  });

请确保使用
resources:videos
将其放在行上方,以便Rails不会查找id=cover\u的视频。

要做到这一点,您需要3个片段协同工作--

1) 控制器中的操作 2) show.html.erb中相应的jQuery,以及 3) 使rails能够将传入数据发送到正确操作的路由

控制器中的操作已关闭,这将起作用:

  def cover_selected
    @video = Video.find(params[:video_id])
    @video.update_attribute(:cover_url, params[:selected_cover])
    respond_to do |format|
      format.all { render :nothing => true, :status => 200 }
    end
  end
jQuery代码还可以,但也可以进行更新,以显示您进入页面时选择的封面:

  $(document).ready(function(){
    var video_id = <%= @video.id %>;
    $('div.row img[id=<%= @video.cover_url || 0 %>]').addClass('selected');
    $('div.row img').click(function(e) {
      e.preventDefault();
      $('div.row img.selected').removeClass('selected');
      $(this).addClass('selected');
      $.ajax({
       url: '/videos/cover_selected/',
       data: { 'selected_cover': this.id,
               'video_id': video_id },
      });     
    });
  });

请确保使用
resources:videos
将其放在行上方,这样Rails就不会查找id=cover\u选中的视频。

我的问题更多的是Rails方面,而不是jQuery方面。哎呀,我的站点上没有URL可以保存此信息。我在视频控制器中创建了一个cover\u selected方法,我正在尝试要做的是向那个控制器发送一个请求,选择按钮\ to或链接\ to action=>cover\ u,cover=>'this.id',等等……我该如何在rails端实现您的方式呢?我花了几个小时查看rails ajax文档,它们似乎专注于表单。您不需要一个URL来进行jquery事件。Terry的例子是关联他将视频缩略图上的点击事件与您的控制器操作放在一起。问题是如何更新变量并将其保存到db。我已经让jQuery关联了一个点击事件,该事件在每个图标周围放置了一个突出显示的框。我没有在这里包含该代码,因为我认为这会分散与用户交流的注意力dbA控制器是一个URL。在MVC中,它是/controller/action/。无论是否显式使用表单,发送到服务器的任何数据都是通过HTTP请求完成的(通常是GET或POST)和被发送到控制器操作。您需要创建一个控制器操作,该操作接受要保存的数据,进行保存并返回结果(即使只是成功/失败)。对于否决我答案的人,我回答了原始问题-“…发送类似于“selected_cover=x”的内容“并将其保存,而无需将用户发送到表单或离开页面。"如果不是他在寻找的,那不是我的错。我的问题更多的是rails方面,而不是jQuery方面。AFIK,我的网站上没有URL可以保存这些信息。我在视频控制器内创建了一个cover_selected方法,我试着向该控制器发送一个请求,按钮是“action=”或“link_to action=>cover_”当选,cover=>'this.id',等等…我将如何在rails端实现您的方式?我花了几个小时查看rails ajax文档,它们似乎专注于表单。您不需要URL来创建jquery事件。Terry的示例是将视频缩略图上的点击事件与您的控制器操作相关联。question是关于如何更新变量并将其保存到db中的。我已经让jQuery关联了一个单击事件,在每个图标周围放置了一个突出显示的框。我没有在这里包含该代码,因为我认为这会分散与dbA控制器通信的问题的注意力。在MVC中,它是/controller/action/。无论您是否如果显式使用表单,则发送到服务器的任何数据都通过HTTP请求(通常为GET或POST)完成,并发送到控制器操作。您需要创建一个控制器操作,该操作接受要保存的数据,执行保存并返回结果(即使只是成功/失败).对于否决我答案的人,我回答了最初的问题-“…发送类似于“selected_cover=x”的内容,并在不将用户发送到表单或离开页面的情况下保存它。”如果这不是他在寻找的,那不是我的错。
  get 'videos/cover_selected'