我正在创建一个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”。
我该怎么做才能使这项工作?
提前谢谢
答案 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| %>