我有一个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
答案 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);
});
});