#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
?