$ .ajax()调用不按我的意愿工作

时间:2011-03-16 07:19:28

标签: ruby-on-rails ruby ajax jquery

所以我做了这个ajax调用:

$.ajax({
   type: "POST",
   url: "/videos",
   data: { title: oembed.title }
});

在此函数内调用Embedly API:

$('a.oembed').embedly({maxWidth:300,'method':'replace'}).bind('embedly-oembed', function(e, oembed){ 
});

现在这个$ .ajax()调用的工作方式有两个问题。首先,它每次加载index视图时都在调用,这是有道理的,因为那是我指向网址的地方。但是,我希望在创建视频时只调用一次,而我不知道如何将其指向create方法。

其次,ajax调用只是向数据库添加一个空行,标题是由嵌入式API动态生成并存储在oembed哈希中(选择器在我的视图中查找视频链接)并将其转换为嵌入式视频,并将所有视频的属性存储在oembed)中,而不是插入到我的数据库中。我正在尝试将这个动态生成的标题存储到我的数据库中。

我如何实现这两个目标?

更新:如果您感到好奇并希望看到这一点,请在此处分叉代码:https://github.com/meltzerj/Dreamstill

更新2:这是控制台所说的内容。请注意,一个用于create,另一个用于show

于2011年3月16日星期三03:03:12 -0700 2011年开始发布“/ videos”for 127.0.0.1   由VideosController处理#create as   参数:{“title”=>“独家:Charlie Sheen说他'不是双极而是'双赢'(02.28.11)”}   AREL(0.4ms)INSERT INTO“videos”(“description”,“thumbnail_url”,“release”,“video_url”,“user_id”,“title”,“embed_code”,“created_at”,“updated_at”)VALUES(NULL ,NULL,NULL,NULL,NULL,NULL,NULL,'2011-03-16 10:03:12.277518','2011-03-16 10:03:12.277518') 重定向到http://localhost:3000/videos/413 完成302发现在17ms

于3月16日星期三03:03:03 -0700开始获取“/ videos / 396”为127.0.0.1   由VideosController处理#show as   参数:{“id”=>“396”}   视频加载(0.2ms)选择“视频”。* FROM“视频”WHERE“视频”。“id”= 396 LIMIT 1 渲染视频/ _show_video.html.erb(6.4ms) 在布局/应用程序中呈现视频/ show.html.erb(9.8ms) 在33ms内完成200 OK(浏览次数:24.5ms | ActiveRecord:0.2ms)

2 个答案:

答案 0 :(得分:1)

我分叉你的代码并运行它。我没有遇到您描述的路由问题,但我正在运行Rails 3.0.0。我不知道这是否有所作为。

无论如何,您的application.js文件的运行方式与其编码方式完全相同。基本上发生的事情是:

在索引页面上,每个视频链接的格式为<a href="some_video" class="oembed">some text</a>

application.js中的Javascript正试图将所有oembed分类链接转换为嵌入视频。这样做,一旦它成功,它就会运行AJAX POST,这真的不是你想要的。

我建议的是:

  • 在添加窗口#dialog中,(我相信模态部分),将表单更改为远程表单。
  • 编写javascript视图create.js.erb并添加一些使用Embedly API的JS,以根据URL获取视频的标题。当前使用的方法 - 绑定embedly-oembed方法可能不是最好的方法。 API可能具有获取标题的特定方式,而无需将超链接转换为嵌入。
  • application.js的{​​{1}}事件绑定中删除AJAX调用,因为每次将链接转换为嵌入时都不想创建某些内容。
  • 如果API没有这样的方法,您可以采取以下措施:提交视频 - &gt;使用embedly-oembed在模态partial中生成一个链接,然后使用现有方法和AJAX调用(仅对此窗口调用),它通过PUT执行UPDATE(不是通过POST创建)来更新它刚刚添加到数据库中的视频标题。

希望这有帮助!

答案 1 :(得分:0)

如果您正在使用资源,那么您的新通话应该是GET:视频。检查你的佣金路线。

对于数据,它应采用以下形式:

Parameters: {"video"=>{"title"=>"Exclusive: Charlie Sheen Says He's 'Not Bipolar but 'Bi-Winning' (02.28.11)"}}

不是

Parameters: {"title"=>"Exclusive: Charlie Sheen Says He's 'Not Bipolar but 'Bi-Winning' (02.28.11)"}
基本上,数据应如下所示:

data: { video: {title: oembed.title} }