如何创建没有视图的对象

时间:2015-11-11 16:23:05

标签: ruby-on-rails

我想创建播放器对象,没有此对象模型的视图,也没有其他参数。这是为此对象创建的操作:`

def create
  @player = @tournament.players.new

  if @player.save
    redirect_to @tournament
    render :nothing => true
  end
end

此对象也不需要其他参数,因为所有参数都默认设置。如您所见,我尝试解决我的问题 "渲染:没有=>真"但这不起作用,这是重新开始的:

  

缺少模板播放器/ new,application / new with {:locale => [:en],:formats => [:html],:variants => [],:handlers => [:erb ,:builder,:raw,:ruby,:coffee,:haml,:jbuilder]}。

更新

的routes.rb

resources :users
  resources :tournaments do
    resources :players
    resources :rounds do
      resources :duels
    end
  end
end

服务器日志:

  

开始GET" / tournaments / 1 / players / new"对于127.0.0.1在2015-11-11 17:37:00 +0100     ActiveRecord :: SchemaMigration Load(0.2ms)SELECT" schema_migrations"。* FROM" schema_migrations"   由PlayersController处理#new为HTML     参数:{" tournament_id" =>" 1"}     锦标赛负荷(0.5ms)SELECT"锦标赛"。* FROM"锦标赛"在哪里"锦标赛"。" id" =?限制1 [[" id",1]]   在86ms内完成500内部服务器错误(ActiveRecord:1.3ms)

     

ActionView :: MissingTemplate(缺少模板播放器/ new,application / new with {:locale => [:en],:formats => [:html,:xml],:variants => [], :handlers => [:erb,:builder,:raw,:ruby,:coffee,:haml,:jbuilder]}。搜索:     *" / home / adam / workspace / tc / app / views"     *" /home/adam/.rvm/gems/ruby-2.2.2/gems/devise-3.4.1/app/views"   ):

     

开始GET" / tournaments / 1 / players / new"对于127.0.0.1在2015-11-11 17:37:01 +0100   由PlayersController处理#new为HTML     参数:{" tournament_id" =>" 1"}     锦标赛负荷(0.1ms)SELECT"锦标赛"。* FROM"锦标赛"在哪里"锦标赛"。" id" =?限制1 [[" id",1]]   在5ms内完成500内部服务器错误(ActiveRecord:0.1ms)

     

ActionView :: MissingTemplate(缺少模板播放器/ new,application / new with {:locale => [:en],:formats => [:html],:variants => [],:handlers = > [:erb,:builder,:raw,:ruby,:coffee,:haml,:jbuilder]}。搜索:     *" / home / adam / workspace / tc / app / views"     *" /home/adam/.rvm/gems/ruby-2.2.2/gems/devise-3.4.1/app/views"   ):

玩家创建按钮,在动作锦标赛中呈现#index :(可能问题从这里开始)

%td= link_to 'Join', new_tournament_player_path(tournament), class: "btn btn-primary btn-md"

如何解决此问题?

1 个答案:

答案 0 :(得分:3)

从服务器日志中可以看到,您的创建操作甚至不在此处调用:

Started GET "/tournaments/1/players/new" for 127.0.0.1
...
Processing by PlayersController#new as HTML

CRUD in Rails

http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

在Rails和REST中,POST请求方法通常用于创建资源。 GET请求应始终是幂等的,而不是创建,更改或销毁服务器上的资源。

为什么呢?因为GET请求存储在浏览器历史记录中。点击后退按钮将导致无意中创建记录被更改或破坏!不好。

如果您想在rails中创建资源而不需要单独的new操作或视图,则可以使用表单:

<%= form_for [tournament, Player.new] do |f| %>
  <%= f.submit %>
<% end %>

提交表单将发出请求:

POST /tournaments/:tournament_id/players

Rails提供了一种称为button_to的便捷方法,它将为您创建一个表单,以便您有一个链接或按钮来发送HTTP动词的扩展列表(POST,PUT / PATCH,DELETE)。

<%= button_to "Join", tournament_players_path(tournament), method: :post %>