Rails & simple_form // 没有路由匹配 [PATCH] "/spots.10"

Rails & simple_form // No route matches [PATCH] "/spots.10"

当我尝试更新模型时出现错误。 spot

No route matches [PATCH] "/spots.7"

我用Rails6,bootstrap和gemsimple_form

我已经手动创建了 config/routes.rb 并且表格与 new.html.erbedit.html.erb

相同

路线

  index GET    /spots(.:format)               spots#index
    new GET    /spots/new(.:format)           spots#new
  spots POST   /spots(.:format)               spots#create
   edit GET    /spots/show/:id/edit(.:format) spots#edit
 update PATCH  /spots/:id(.:format)           spots#update
   show GET    /spots/show/:id(.:format)      spots#show
 delete DELETE /spots/:id(.:format)           spots#destroy

控制器

class SpotsController < ApplicationController
  before_action :set_spot, only: [:show, :destroy, :edit, :update]

  def index
    @spots = Spot.all
  end

  def show
  end

  def new
    @spot = Spot.new
  end

  def create
    @spot = Spot.new(spot_params)
    @spot.save
    redirect_to index_path
    
  end

  def edit
  end

  def update
    @spot.update(spot_params)
    redirect_to index_path
    
  end

  def destroy
    @spot.destroy

    redirect_to index_path
  end


  private

  def spot_params
    params.require(:spot).permit(:name, etc...)
  end

  def set_spot
    @spot = Spot.find(params[:id])
  end

end

查看 - edit.html.erb

<div class="container">

    <h1>FORM</h1>

    <%= render "form", spot: @spot %>

</div>

部分_form

#HERE, i think, it come from this underline, the url passed as argument is bad 
    <%= simple_form_for (spot), url:(spot.new_record? ? spots_path : spots_path(spot)) do |f| %> 
      <%= f.input :name %>
             .
             .
             .

      <%= f.submit %>
    <% end %>

我试过很多东西。

Path helpers generate paths with dots instead of slashes

Rails creating malformed routes with dots

单数化spot_path(spot)也给我报错

我想,我很接近,但我看不到我的错误!

非常感谢

你的错误在于你的路径助手: spots_path 正在生成通往 spots#index 的路线,因此 "/spots"。如果你像这样给它一个参数: spots_path(spot) 所有路径助手方法可以做的就是将它附加到路径,因此它生成 "/spots.10".

如果您要在 Rails 中生成 7 个 CRUD(创建、读取、更新、销毁)路由,您应该在 routes.rb 中使用 resources :spots 而不是手动执行。这也将为路径助手生成正确的前缀,您可以在终端中使用命令 rails routes 时找到它。

最重要的是:您创建的路线并不完全正确,例如 show 只是 spots/:id(编辑时相同)。但是我猜这行不通(这是因为如果您手动创建路由,则需要在新路由上方定义显示路由,否则它会与新路由混淆)。

至于表单,您不需要手动创建 url,Rails' 表单助手负责生成正确的路由,具体取决于记录是否是新的,所以<%= simple_form_for (spot) do |f| %> 就足够了。