Rails没有路由匹配更新时的POST网址与单个资源

时间:2018-01-31 11:22:57

标签: ruby-on-rails forms resources

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

配置/ routes.rb中

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

控制器/ basics_controller.rb

private

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

视图/基础/ _form.html.erb

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

表单显示时我没有任何问题。但是,当我提交它时,我收到以下错误:

  

没有路线匹配[POST]“/ admin / basics / edit”

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

我该怎么做才能使这项工作?

提前谢谢

1 个答案:

答案 0 :(得分:3)

看起来您可能将错误的实例变量传递给form_with方法? IIRC,如果模型参数为nil,则Rails假定表单操作应与当前路径相同。

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

您可以尝试在控制器中初始化@basic,如下所示

def set_basic
  @basic = Basic.first_or_initialize
end

然后将其传递给form_with

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