【问题标题】:No route matches [POST] "/downtowns/1/properties/new"没有路线匹配 [POST] "/downtowns/1/properties/new"
【发布时间】:2020-02-14 00:41:48
【问题描述】:

我有一个与市区和物业有一对多关系的应用程序。我一直遇到的麻烦是从市中心创建新物业。我不断收到我用作此问题标题的错误。

我有一种预感,问题出在我的表单中(我使用的是简单表单 gem)。我可以去我的new 页面,填写表格,然后当我点击提交时,我收到了这个错误。

我将首先显示我的表单文件。 (我无法理解简单表单的文档,这就是为什么我认为这就是问题所在)

= simple_form_for (@property), method: 'POST', url: new_downtown_property_path do |f|
  = f.input :name
  = f.input :last_remodel
  = f.input :original_construction_year

我的路线文件

resources :downtowns do
  resources :properties
end

我的市区控制器

def show
    @properties = Property.where(downtown: @downtown_id)
  end

  def new
    @downtown = Downtown.new
  end

  def create
    @downtown = Downtown.create(downtown_params)
    if @downtown.save
      redirect_to @downtown
    else
      render 'new'
    end
  end

  def downtown_params
    params.require(:downtown).permit(:name, :city)
  end

和我的属性控制器

  def new
    @property = Property.new
  end

  def create
    @downtown = property.find(id)
    @property = Property.create(params[:property_params])
    @property.downtown_id = @downtown.id

    if @property.save
      redirect_to @property
    else
      render 'new'
    end
  end

  def show
  end

【问题讨论】:

    标签: ruby-on-rails ruby routing simple-form


    【解决方案1】:
    = simple_form_for([@downtown, @property]) do |f|
      = f.input :name
      = f.input :last_remodel
      = f.input :original_construction_year
    

    只需传递一个数组即可使用多态路由助手查找嵌套路由。这将正确使用downtown_properties_path 作为操作。在 Rails 中,您总是通过发布到集合路径 (/downtowns/1/properties) 来创建资源。新路由只是呈现一个表单。您不需要指定方法,因为 Rails 会检测模型是否已持久化并相应地将方法设置为 POST 或 PATCH。

    您也不应该在方法名称和 Ruby 中参数列表周围的括号之间添加空格:

    def add(a,b)
      a + b
    end
    
    add (1, 2) # syntax error
    add (1), 2 # this is what actually happens 
    

    Ruby 的行为与这里的 JS 非常不同,因为括号对于方法调用是可选的。

    您的控制器也完全关闭。嵌套的资源控制器应该看起来像。

    class PropertiesController < ApplicationController
      before_action :set_downtown
      before_action :set_property, only: [:show, :edit, :update, :destroy]
    
      # GET /downtowns/1/properties/new
      def new
        @property = @downtown.properties.new
      end
    
      # POST /downtowns/1/properties
      def create
        @property = @downtown.properties.new(property_params)
        if @property.save
          redirect_to @property 
        else
          render :new
        end
      end
    
      # ...
    
      private
    
      def set_downtown
        @downtown = Downtown.includes(:properties).find(params[:downtown_id])
      end
    
      def set_propery
        @property = Property.find(params[:id])
      end
    
      def property_params
        params.require(:downtown)
              .permit(:name, :city)
      end
    
      # ...
    end
    

    【讨论】:

    • 这非常有帮助!我真的很感谢你看看这个并分享你的智慧!谢谢!!
    【解决方案2】:

    您想发帖到downtown_property_path 而不是new_downtown_property_path

    更多阅读在这里https://guides.rubyonrails.org/routing.html

    【讨论】:

      【解决方案3】:

      “/downtowns/1/properties/new”是在渲染模板以创建记录时定义的路由,其动词是GET。

      在表单中,您需要的路径是处理 POST 操作的路由的 URL,并且操作需要处理它我认为它是“properties#create”,如果您想使用 URL,正确的 URL 是“downtown_properties_path”。您可以运行“rails routes”命令来获取详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2018-12-14
        相关资源
        最近更新 更多