используйте другой столбец индекса для загрузки моделей в rails 3

#ruby-on-rails #ruby-on-rails-3 #routes #nested-routes

#ruby-on-rails #ruby-on-rails-3 #маршруты #вложенные маршруты

Вопрос:

В моем приложении пользователи могут хранить частные сделки на своих счетах, такие сделки видны только им.

Торговая модель выглядит следующим образом:

 class Trade < ActiveRecord::Base

  scope :by_user, lambda { |user|
    where(user_id: user.id) unless user.nil?
  }

  belongs_to :status
  belongs_to :user
  

маршрут выглядит следующим образом:

 resources :users do 
  resources :trades
end
  

итак, генерируя URL-адреса, такие как:

 /users/:user_id/trades/:id/edit
  

В настоящее время, например, если в системе хранятся три сделки, новый пользователь при создании своей первой сделки будет создавать сделку с id = 4, а его URL для ее поиска будет: /users/2/trades/4

Я хотел бы, чтобы у сделок был новый sequence_number столбец, и это должно использоваться в идентификаторе для поиска сделок.

Таким образом, каждый пользователь будет видеть только свои сделки, и все они будут пронумерованы, начиная с 1.

Ответ №1:

Чтобы изменить параметр, переданный для маршрута, сначала измените в своем контроллере, как вы находите trade заданный :id параметр для этого торгового параметра.

 class TradeController < ApplicationController
  before_action :find_trade, only [:edit, :show, :update, :destroy]
  # Remove @trade = Trade.find(params[:id]) from those four actions

  private
    def find_trade
      @user = User.find params[:user_id]
      @trade = @user.trades.find_by sequence_number: params[:id]
    end
end
  

Затем в вашей Trade модели создайте sequence_number свой новый параметр.

 class Trade < ActiveRecord::Base
  def to_param
    sequence_number
  end
end
  

to_param Метод модели изменяет параметр, передаваемый в маршрутах, для trades/:id from id to sequence_number . Итак, в приведенном выше примере для нового пользователя отображение их первой сделки будет /users/2/trades/1 , а не /users/2/trades/4 .

Комментарии:

1. Спасибо, хорошая идея выполнить действие before. Почему вы используете его только с действиями edit и show ? разве вы не можете сделать это также для update и destroy ?