Рельсы URL идут в обратном направлении - PullRequest
0 голосов
/ 15 февраля 2020

У меня странная проблема. У меня в приложении две модели: даунтаунс и свойства. Даунтаун должен иметь несколько свойств, а свойства должны иметь один центр города.

На моей странице в центре города укажите oop через свойства в каждом центре города, а затем предложите ссылки на эти объекты.

Проблема в том, что ..... когда я нажимаю на каждое свойство, URL возвращается назад. IE, центр города с идентификатором 1 и свойством с идентификатором 8 должен go

downtown/1/properties/8

все же он продолжает работать

downtown/8/properties/1

Я думаю, что это так странно, и я понятия не имею, что я делаю здесь неправильно.

На моей странице показа в центре города, по 1030 * через каждое свойство

%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.

Мои маршруты - это базовая c вложенная маршрутизация здесь

  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

Наконец, в форме моих свойств у меня есть полиморф c путь

= simple_form_for([@property, @downtown]) do |f|
  = f.input :name
  = f.input :last_remodel
  = f.input :original_construction_year

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Вложенный путь маршрута принимает несколько аргументов Руководство по Rails .

В вашем случае это должно быть downtown_property_path(@downtown, property)

0 голосов
/ 15 февраля 2020

Я хотел бы дать ответ, который может упростить вашу маршрутизацию.

Если ваши свойства могут ссылаться только на один центр города (что, по мнению ваших контроллеров, имеет место), то вам не нужно иметь URL-адреса, такие как downtown/1/properties/8.

Чтобы получить доступ к свойству с идентификатором 8, вам нужно просто go и использовать properties/8, поскольку в действии контроллера вы сможете загрузить соответствующий центр города (с id = 1), так как он упоминается в записи свойства. Действие show для вложенного ресурса обычно не требует go через родительский ресурс.

PS: доступ к вложенным ресурсам через родительский ресурс в основном полезен, когда дочерний ресурс (properties в вашем case) может иметь несколько связанных с ним родительских ресурсов (downtowns).

...