Ruby on rails Rails URL向后移动

Ruby on rails Rails URL向后移动,ruby-on-rails,ruby,routing,simple-form,Ruby On Rails,Ruby,Routing,Simple Form,我有一个奇怪的问题。我的应用程序中有两个模型:市中心和酒店。市中心应有多处房产,市中心应有一处房产 在我的商业区展示页面上,我在每个商业区循环浏览酒店,然后提供指向这些酒店的链接 问题是……当我单击每个属性时,url会向后移动。也就是说,一个ID为1的市中心和一个ID为8的房产应该去 downtown/1/properties/8 但它仍在继续 downtown/8/properties/1 我觉得这太奇怪了,我不知道我到底做错了什么 在我的“市中心秀”页面上,我循环浏览每一处房产 %h2=

我有一个奇怪的问题。我的应用程序中有两个模型:市中心和酒店。市中心应有多处房产,市中心应有一处房产

在我的商业区展示页面上,我在每个商业区循环浏览酒店,然后提供指向这些酒店的链接

问题是……当我单击每个属性时,url会向后移动。也就是说,一个ID为1的市中心和一个ID为8的房产应该去

downtown/1/properties/8
但它仍在继续

downtown/8/properties/1
我觉得这太奇怪了,我不知道我到底做错了什么

在我的“市中心秀”页面上,我循环浏览每一处房产

%h2= @downtown.name
- if @downtown.properties.present?
  %p 
    - @downtown.properties.collect do |property|
      = link_to property.name, downtown_property_path(property)

- else
  No downtowns for now.
我的路由是这里的基本嵌套路由

  resources :downtowns do
    resources :properties
  end
我的属性控制器是

class PropertiesController < Downtown::ApplicationController
  before_action :find_property, only: [:show, :edit, :update, :destroy]

  def new
    @property = @downtown.properties.new
  end

  def create
    @property = @downtown.properties.new(property_params)

    if @property.save
      redirect_to @downtown
    else
      render :new
    end
  end

  def show
  end

  private

  def property_params
    params.require(:property).permit(:name, :downtown, :downtown_id......)
  end

  def find_property
    @property = Property.find(params[:id])
  end
end

嵌套路由路径接受多个参数


在您的情况下,它应该是
闹市区\u property\u path(@downtown,property)

嵌套路由路径具有多个参数


在您的情况下,它应该是
闹市区\u property\u path(@downtown,property)

我想提供一个可能简化您的路由的答案

如果您的属性只能引用一个闹市区(根据您的控制器,情况似乎是这样),那么您不需要像
闹市区/1/properties/8
这样的URL

要访问id为8的属性,您只需转到并使用
properties/8
,因为在控制器操作中,您将能够加载相关的数据(id=1),因为它在属性记录中被引用。嵌套资源的
show
操作通常不需要经过父级


PS:当子资源(
属性
在您的情况下)可以有多个父资源链接到它(
市中心
)时,通过父资源访问嵌套资源非常有用。

我想提供一个可能简化路由的答案

如果您的属性只能引用一个闹市区(根据您的控制器,情况似乎是这样),那么您不需要像
闹市区/1/properties/8
这样的URL

要访问id为8的属性,您只需转到并使用
properties/8
,因为在控制器操作中,您将能够加载相关的数据(id=1),因为它在属性记录中被引用。嵌套资源的
show
操作通常不需要经过父级


PS:当子资源(
properties
在您的例子中)可以有多个父资源链接到它(
downtowns
)时,通过父资源访问嵌套资源非常有用。

如果是嵌套路由,它可能应该将@downtown作为第一个参数:
downtown\u property\u path(@downtown,property)
我还建议查看指南中的部分。如果是嵌套路线,则可能应将@downtown作为第一个参数:
downtown\u property\u path(@downtown,property)
我还建议查看指南中的部分。
class DowntownsController < ApplicationController
  before_action :find_downtown, only: [:show, :edit, :update, :destroy]

  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

  private

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

  def find_downtown
    @downtown = Downtown.find(params[:id])
  end  
end
= simple_form_for([@property, @downtown]) do |f|
  = f.input :name
  = f.input :last_remodel
  = f.input :original_construction_year