7

I've got a jQuery function that is called after a doubleclick on a list item.

app/assets/javascripts/tile/tile.js

$('#list > li').dblclick(function(){
  // styling
  $(this).toggleClass('liked');

  // pass ID to controller
  var movie_id = $(this).attr("data-id");
  $.getScript("/likes.js");
});

Next to applying some new formats to said item my main goal is to make a database entry from my like controller. In this Railscast the index action from their comments controller gets called with this simple line.

$.getScript("/comments.js");

Additionally some JavaScript gets called from a index.js.erb file.

My first problem with understanding the example code from Railscasts is how they define the action. If I wanted to call the action createLike from my likes_controller how would I call it?

Secondly, my attempts so far have all failed because both the JavaScript file doesn't load and the action doesn't get called aswell.

Somehow I sense that I've messed up with the paths. Where should I locate the JavaScript files that should get called with the getScript function?

Files

app/assets/javascripts/likes/index.js.erb

console.log("Test");

app/controllers/likes_controller.rb

class LikesController < ApplicationController
  protect_from_forgery

  def index
    Like.create(:user_id => current_user.id, :item_id => params[:id])
  end
end
4

5 回答 5

3

我相信执行问题可以通过将 index.js.erb 从

应用程序/资产/javascripts/likes/index.js.erb

应用程序/视图/喜欢

这是 Rails 寻找要呈现的模板的地方(资产管道不应该为您的脚本提供服务)。Rails 通过约定解决了这个问题 - 您的应用程序自动将 /likes 路由到 index 操作。

如果您想要一条信息更丰富的路由,请使用Rails 路由指南生成新路由并将其与 Likes 控制器中的 create_likes 操作相匹配。然后, $.getScript("/create_likes.js") 将知道在哪里看

于 2013-07-23T22:16:44.580 回答
2

这可能与您的答案不太接近,但我会在页面呈现后$.getscript()加载那些js/css我需要的文件,这反过来会提高性能并减少页面加载时间。这是我在文件中使用的代码。我的erbshop_for_free_module .js 驻留在app/public/javascripts

<script type="text/javascript">
    jQuery(document).ready(function($){
        //this gives your protocol-http
        var protocol = this.location.protocol;
        //this gives your domain name-myshopptinsite.com
        var host = this.location.host;
        var initial_url = protocol + "//" + host;
        $.getScript(initial_url + "/javascripts/eshop_js/shop_for_free_module.js");
    });
</script>

...希望能帮助到你。

于 2013-07-26T12:55:16.220 回答
2

试试这个

问:我理解 Railscasts 示例代码的第一个问题是它们如何定义动作。如果我想从我的 likes_controller 调用操作 createLike 我将如何调用它?

回答:

class LikesController < ApplicationController

  def create_like
    Like.create(:user_id => current_user.id, :item_id => params[:id])
  end
end

在 routes.rb 文件中

get '/create_like.js' => 'likes#create_like'

问题:其次,到目前为止,我的尝试都失败了,因为 JavaScript 文件没有加载并且操作也没有被调用。

回答:移动 app/assets/javascripts/likes/index.js.erb

代码到

app/views/likes/create_like.js.erb

您需要将 item_id 传递给

getScript 方法

$(document).ready(function() {

$('#list > li').dblclick(function(){
  // styling
  $(this).toggleClass('liked');

  // pass ID to controller
  var item_id = $(this).attr("data-id");
  $.getScript("/create_like.js?item_id=" + item_id);
});
});
于 2013-07-26T20:04:42.803 回答
2

您可以像这样在控制器中定义操作:

class LikesController < ApplicationController
  # another code
  def createLike
    # your action code
  end
  # another code
end  

您可以调用类似的操作/likes/createLike
在文件夹中PATH_TO_APP/app/views/likes创建一个文件createLike.html.erb- 会有一个createLike视图

Javascript 文件必须在文件夹/PATH_TO_APP/public/javascripts
中包含 javascript 文件的最佳方法是javascript_include_tag,例如:

<%= javascript_include_tag "tile/tile.js" %>  

tile.js文件必须在/PATH_TO_APP/public/javascripts/tile目录中。

如果你想用 jQuery 获取 javascript 文件,你必须把它们放在public/javascripts目录中并调用$.getScript('/javascripts/likes.js');- 有一个例子。

PS我建议看一下入门指南

于 2013-07-23T11:31:21.730 回答
2

您想要的行为与特定 Railscasts 正在解决的行为不同。它特别专注于在创建新评论时检索它们,而无需刷新页面。这就是您在遵循本指南时遇到问题的原因。

首先,您需要确保您resources :likes的 config/routes.rb 中有一个。从您的代码摘录看来,您正在将点赞与电影相关联,因此请确保将路由嵌套在您的resources :movies调用中。最后,您的路线应如下所示:

resources :movies do
  resources :likes
end

对于控制器部分,您需要向控制器添加“创建”操作。假设您的 Movie 模型has_many :likes是您的动作的简单版本:

def create
  movie = Movie.find(params[:movie_id])
  movie.likes.create(user_id: current_user.id)
end

您还需要更改您的 javascript 代码以发布帖子而不是获取请求。这是因为 http 方法是 Rails 区分创建请求和索引请求的方式,因为它们都使用相同的 url 路径(例如 /comments.js)。您还需要让 url 反映它是电影中的嵌套资源。以下是修改后的 JS 代码版本:

$('#list > li').dblclick(function() {
  // Cached jquery this selector.
  $this = $(this)

  // pass ID to controller
  var movie_id =  $this.data('id');
  $.post('/movies/' + movie_id + '/likes.js', function() {
    $this.toggleClass('liked');
  });
});

关于您的 .js.erb 文件,正如其他人所说,它应该放在您的app/views文件夹中。但是,由于您的常规 JS 处理逻辑,您不需要拥有所有这些。

这只是一种策略,但还有很多其他方法可以处理 JS 与 Rails 的交互。如果您想要一个使用 js.erb(在本例中为 js.coffee)视图文件的示例,您可以查看这个implementation。在这种情况下,所有处理点击事件的都是一个带有 remote: true 选项的 link_to,它将 jquery-ujs 适配器委托给它。

希望有帮助!

于 2013-07-25T00:05:25.850 回答