getScript jQuery路径不起作用/ Ruby on Rails

时间:2013-07-18 19:28:39

标签: ruby-on-rails ruby ruby-on-rails-3 jquery getscript

我有一个jQuery函数,在对列表项进行双击后调用。

应用/资产/ Javascript角/瓦/ tile.js

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

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

接下来将一些新格式应用于所述项目,我的主要目标是从我的like控制器进行数据库输入。在Railscast中,来自index控制器的comments操作会通过这个简单的行进行调用。

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

此外,还会从index.js.erb文件中调用一些JavaScript。

理解Railscasts示例代码的第一个问题是他们如何定义动作。如果我想从我的createLike调用操作likes_controller,我该怎么称呼它?

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

不知何故,我感觉到我已经搞砸了路径。我应该在哪里找到应该使用getScript函数调用的JavaScript文件?

文件

应用/资产/ Javascript角/喜欢/ index.js.erb的

console.log("Test");

应用/控制器/ likes_controller.rb

class LikesController < ApplicationController
  protect_from_forgery

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

5 个答案:

答案 0 :(得分:3)

我相信执行问题可以通过从

移动index.js.erb来解决

应用/资产/ Javascript角/喜欢/ index.js.erb的

应用/视图/喜欢

这是Rails查找要呈现的模板的位置(您的脚本不应由资产管道提供)。 Rails通过约定解决了这个问题 - 您的应用程序自动路由/喜欢索引操作。

如果您想要更具信息性的路线,请使用Rails routing guide生成新路线并将其与Likes控制器中的create_likes操作相匹配。然后,     $ .getScript( “/ create_likes.js”) 会知道在哪里看

答案 1 :(得分: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'); - 这是一个例子。

P.S。我建议您查看getting started guide

答案 2 :(得分:2)

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

首先,您需要确保config / routes.rb中有resources :likes。从您的代码摘录中看起来您正在将类似内容与电影相关联,因此请确保将该路线嵌套在resources :movies电话中。最后,您的路线应如下所示:

resources :movies do
  resources :likes
end

对于控制器部件,您需要向控制器添加“创建”操作。假设您的电影模型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)。您还需要让网址反映出它是电影中的嵌套资源。以下是具有该更改的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处理逻辑,因此您无需拥有所有这些逻辑。

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

希望有所帮助!

答案 3 :(得分:2)

这可能与您的答案不太接近但我使用$.getscript()加载我的页面呈现后所需的js/css个文件,这反过来又提高了性能并缩短了页面加载时间。这是我在erb个文件中使用的代码。我的shop_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>

...希望它有所帮助。

答案 4 :(得分: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文件都没有加载,并且动作也没有被调用。

Anaswer:移动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);
});
});