Rails 使用 JBuilder 响应 (AngularJS)

Rails respond with JBuilder (AngularJS)

我有一个简单的斯诺克联赛应用程序,我在 LeaguesController 中有一个操作 add_player。我的客户 (AngularJS) 调用此操作,我想使用 JBuilder 以 json 格式响应。这个工作正常:

 def add_player
   ...

   render :json => @league.players.to_json(:only => [ :id, :firstname, :lastname, :max_break, :email ])
end

但是当我删除这一行并添加:

respond_to do |format|
  format.html 
  format.json 
end

我有这个错误:

ActionView::MissingTemplate (
  Missing template leagues/add_player, 
  application/add_player 
  with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb,    :builder, :raw, :ruby, :coffee, :jbuilder, :haml]}. 
  Searched in:
* "/home/daniel/SitesWWW/snookerLeague/app/views"
):
app/controllers/leagues_controller.rb:67:in `add_player'

我当然有文件 add_player.json.jbuilder:

json.players @league.players do |player|
  json.id player.id
  json.firstname player.firstname.capitalize if player.firstname
  json.lastname player.lastname.capitalize if player.lastname
  json.email player.email
  json.max_break player.max_break
end

那么,我该怎么办?

请注意您的错误消息 :formats=>[:html] 这向我表明它正在尝试呈现 add_player.html.erb 而不是您的 jbuilder 模板。

要验证这一点,请尝试更改调用代码并将 .json 附加到 url,这将强制格式为 json.

您还可以在路由中指定默认值 json,而不将其包含在 url 中:

resources :leagues, defaults: { format: :json } do
  member do
    post :add_player
  end
end

另请参阅:http://guides.rubyonrails.org/routing.html#defining-defaults