代码之家  ›  专栏  ›  技术社区  ›  Jaeger

使用单个资源更新时Rails无路由匹配帖子url

  •  2
  • Jaeger  · 技术社区  · 6 年前

    我正在创建一个Rails应用程序,其中有一个资源用作整个网站的常规设置。我将所有设置如下:

    配置/路由。rb型

    authenticate :user do
      scope '/admin' do
        resource :basics #This is my resource's name, put in singular 
        # ...
      end
    end
    

    控制器/basics\u控制器。rb型

    private
    
    # Use callbacks to share common setup or constraints between actions.
    def set_basic
      @basic = Basic.first
    end
    

    视图/基础/\u表单。html。雇员再培训局

    <%= form_with(model: @basics, local: true) do |form| %>
    

    这是什么 rake routes 显示有关此资源的信息:

    new_basics GET    /admin/basics/new(.:format)      basics#new
    edit_basics GET    /admin/basics/edit(.:format)    basics#edit
    basics GET    /admin/basics(.:format)              basics#show
           PATCH  /admin/basics(.:format)              basics#update
           PUT    /admin/basics(.:format)              basics#update
           DELETE /admin/basics(.:format)              basics#destroy
           POST   /admin/basics(.:format)              basics#create
    

    我在显示表单方面没有任何问题。然而,当我提交它时,我得到以下错误:

    没有与[发布]匹配的路由“/管理/基本/编辑”

    当我查看HTML生成的表单时,我可以看到它将“/admin/basics/edit”作为一个动作传递,而在我的情况下,它应该只是“/admin/basics”。

    我应该怎么做才能让它工作?

    提前谢谢你

    1 回复  |  直到 6 年前
        1
  •  3
  •   messanjah    6 年前

    看起来您可能将错误的实例变量传递给 form_with 方法如果model参数为nil,那么Rails假设form操作应该与当前路径相同。

    @basics 未定义(至少在您共享的控制器代码中)。将其替换为 @basic 可能适用于编辑(当 Basic.first 存在),但不创建(如果 基本的第一 不存在)。

    您可以尝试初始化 @基本的 像这样在你的控制器里

    def set_basic
      @basic = Basic.first_or_initialize
    end
    

    然后将其传递给 form\u with

    <%= form_with(model: @basic, local: true) do |form| %>