【问题标题】:How to create object without view如何创建没有视图的对象
【发布时间】:2016-02-12 19:24:41
【问题描述】:

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

def create
  @player = @tournament.players.new

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

这个对象也不需要额外的参数,因为所有参数都是默认设置的。如您所见,我尝试解决我的问题 "render :nothing => true" 但这不起作用,结果如下:

缺少模板 player/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

服务器日志:

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

ActionView::MissingTemplate(缺少模板播放器/新的,应用程序/新的 {: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” ):

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

ActionView::MissingTemplate(缺少模板播放器/新的,应用程序/新的 {: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"

我该如何解决这个问题?

【问题讨论】:

  • 在create action中寻找新的视图文件?
  • 是的,这里出了点问题 - 按照惯例,Rails 会查找 /players/create.html.erb,除非您的控制器显式重定向或呈现(如 render :nothing => true)。如果您的创建操作甚至被调用,请检查服务器日志。如果您包含您执行的确切步骤和您的 routes.rb 可能会有所帮助
  • @japed 我更新了我的问题。

标签: ruby-on-rails


【解决方案1】:

从服务器日志中可以看出,这里甚至没有调用您的创建操作:

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

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 %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多