如何在ember中链接到特定的rails API路由和服务器生成的内容?

我有一个混合的Ember / Rails应用程序,在API命名空间中有一个Rails路由来获取任何单个事件并将其转换为.ics文件以导入到用户的日历中( 这是一个问题 )。 Ember正在使用命令ember server --proxy http://localhost:3000 ,它将它连接到Rails服务器进程。

以下片段说明了我的设置:

Rails routes.rb片段:

 namespace :api do # snip resources :events do # snip get 'export_event_ical', on: :member end end 

Rails events_controller.rb片段:

 def export_event_ical @event = Event.find(params[:id]) @calendar = Icalendar::Calendar.new ical_event = Icalendar::Event.new ical_event.dtstart = @event.start.strftime("%Y%m%dT%H%M%S") ical_event.dtend = @event.start.strftime("%Y%m%dT%H%M%S") ical_event.summary = @event.body.truncate(50) ical_event.description = @event.body # event.location = @event.location @calendar.add_event ical_event @calendar.publish headers['Content-Type'] = "text/calendar; charset=UTF-8" render :text => @calendar.to_ical end 

因此,例如,在我的Ember / Handlebars索引模板中,如果我有一个引用单个事件的event参数,我可以使用Export to iCal以达到Rails提供的API路由(即,在端口4200上跳过Ember并在3000处与Rails交谈)。

到现在为止还挺好。 但是我如何将它变成一个动态的Ember控制链接,通过Ember路由到Rails?

我尝试过一些不起作用的东西:

  • 添加路由到Ember events资源( router.js ):

     this.resource('events', function() { this.route('show', {path: ':event_id'}); this.route('export_to_ical', { path: '/api/events/:event_id/export_event_ical' }); }); 
  • 将一些goofball jQuery添加到events.js路由作为按钮操作并在我的模板中使用

    从’余烬’importEmber;

     export default Ember.Route.extend({ actions: { exportToICal: function(eventID) { $.get('/api/events/' + eventID + '/export_event_ical', function(){ alert('Got here.'); }); } } }); 
  • 阅读一些文档:

    • http://guides.emberjs.com/v1.10.0/components/sending-actions-from-components-to-your-application
    • EmberJS – 如何使用linkTo动态生成链接?

你怎么在Ember做这件事?

在我的应用程序中,我使用环境来声明服务器端点,类似于rails,位于底部:

 /* jshint node: true */ 'use strict'; var extend = require('util')._extend; module.exports = function(environment, appConfig) { var ENV = extend(appConfig, { EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build // eg 'with-controller': true } }, APP: { // Here you can pass flags/options to your application instance // when it is created }, }); if (environment === 'development') { ENV.serverHost = 'http://localhost:3000'; } return ENV; }; 

然后你可以像这样获取值

 var config = this.container.lookup('config:environment'); var url = config.serverHost + "/...";