首页 > 解决方案 > 为什么 redirect_to 在创建操作中不起作用?

问题描述

Rails 初学者在这里,不知何故我在创建记录后找不到重定向用户的方法。

我有这个控制器:

  def create
    @product = Product.new(product_params)

    respond_to do |format|
      if @product.save
        format.html { redirect_to @product, notice: 'Product successfully created' }
      else
        format.html { render :new, notice: 'Error' }
      end
    end
  end

  def product_params
    params.require(:product).permit(:name, :description, :price, :quantity, :status, :image)
  end

我尝试了一些变体,例如redirect_to product_path(@product)或删除format块,但没有任何效果。提交值的模型和表单似乎工作(通过验证,保存记录)。

日志:

Parameters: {"..."}
  User Load (0.2ms)  SELECT ....
  ↳ app/controllers/application_controller.rb:15:in 'admin?'
   (0.1ms)  BEGIN
  ↳ app/controllers/products_controller.rb:24:in 'block in create'
  Product Exists? (0.4ms)  SELECT 1 ...
  ↳ app/controllers/products_controller.rb:24:in 'block in create'
  Product Create (3.3ms)  INSERT INTO ...
  ↳ app/controllers/products_controller.rb:24:in 'block in create'
   (55.3ms)  COMMIT
  ↳ app/controllers/products_controller.rb:24:in 'block in create'
Redirected to http://localhost:3000/products/4137
Completed 200 OK in 65ms (ActiveRecord: 59.3ms | Allocations: 4974)

有些东西阻止了重定向(更改页面后我仍然有notice消息),但控制器、表单、模型和日志对我来说看起来还不错。有谁知道这里可能负责什么?任何帮助将不胜感激!

标签: ruby-on-railsruby-on-rails-6

解决方案


如果您form_with在 Rails 6 中使用帮助程序,那么它们默认是XHR表单,并且它们需要一个带有js格式的模板。要使它们响应html格式,请添加local: true选项。

<%= form_with(model: @product, local: true) do |f| %> 

从 Rails 指南,

:local- 默认情况下,表单提交是远程且不显眼的 XHR。使用 local: true 禁用远程提交。

更多信息 - form_with 选项

希望有帮助!


推荐阅读