【问题标题】:getScript jQuery path not working / Ruby on RailsgetScript jQuery 路径不起作用/Ruby on Rails
【发布时间】:2013-07-18 19:28:39
【问题描述】:

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

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");
});

除了对上述项目应用一些新格式之外,我的主要目标是从我的like 控制器创建一个数据库条目。在这个Railscast 中,来自他们的comments 控制器的index 操作被这个简单的行调用。

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

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

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

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

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

文件

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

【问题讨论】:

  • 我不确定你在问什么...你想使用 AJAX 调用来发送\接收来自服务器的信息吗?
  • 直到星期四我才能尝试你所有的好建议...谢谢你的帮助!!

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


【解决方案1】:

我相信执行问题可以通过移动 index.js.erb 来解决

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

应用/浏览/喜欢

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

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

【讨论】:

  • 感谢分配,这对我有用! :) 更改 JS 文件的路径后,我必须将 resources :likes 添加到我的路由中,以便它将 GET /likesindex 操作匹配。
【解决方案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

【讨论】:

    【解决方案3】:

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

    首先,您需要确保在 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 路径(例如 /cmets.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 适配器委托给它。

    希望有帮助!

    【讨论】:

      【解决方案4】:

      这可能与您的答案不相近,但我使用$.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>
      

      ...希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        试试这个

        问题:我理解 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);
        });
        });
        

        【讨论】:

        • @TheChamp 更新了我的答案,修复了调用 getScript 方法中的代码错误,而不是 likes.js 必须调用 create_like.js。
        猜你喜欢
        • 2013-09-14
        • 1970-01-01
        • 2013-05-02
        • 2013-12-24
        • 2017-02-02
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多