Rails URL向后移动

问题描述 投票:0回答:2

我有一个奇怪的问题。我的应用程序中有两个模型,分别是市区和房地产。市区应具有多个物业,物业应具有一个市区。

在我的市区秀页面上,我遍历每个市区的属性,然后提供这些属性的链接。

问题是.....当我单击每个属性时,URL向后移动。 IE,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

我的市区管理员是

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
ruby-on-rails ruby routing simple-form
2个回答
0
投票

嵌套的路由路径采用多个参数Rails Guide

根据您的情况,应该为downtown_property_path(@downtown, property)


0
投票

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

如果您的媒体资源只能引用一个市区(根据您的控制器,情况似乎如此),那么您就不需要使用downtown/1/properties/8之类的URL。

要访问ID为8的属性,您只需简单地使用properties/8,因为在控制器操作中,由于属性记录中已引用了相关的市区(id = 1),因此您可以加载它。

这意味着您的路线将类似于:

resources :downtowns
resources :properties

PS:我相信当子资源(在您的情况下为properties)可以有多个与其链接的父资源(downtowns)时,嵌套资源最有用。

© www.soinside.com 2019 - 2024. All rights reserved.