Как использовать to_param только для одного метода - или отключить для других методов? - PullRequest
0 голосов
/ 08 января 2019

Я создал to_param в своей модели, чтобы я мог найти заказы по их токенам вместо идентификаторов пользователей в URL. Это для гостевых пользователей, которые не вошли в систему. Я делаю это, чтобы другие пользователи не могли просматривать заказы других людей или вообще кого-либо.

У меня есть это в моей модели:

validates :order_token, presence: true
validates :order_token, uniqueness: true
before_validation :generate_token, on: :create

def generate_token
  begin
    self.order_token = SecureRandom.urlsafe_base64(28, false)
  end while self.class.find_by(order_token: order_token)
end

def to_param
  order_token
end

В моем контроллере я использую это с:

def order_confirmation
  @order = Order.find_by(order_token: params[:order_token])
end

Хотя я хочу, чтобы этот find или find_by был ограничен только order_confirmation методом

Когда пользователи входят в систему, я хочу, чтобы их фактические идентификаторы заказа были указаны в URL-адресе (все для зарегистрированных пользователей защищено канканским гемом). Так им удобнее.

Как ограничить переопределение to_param только для одного метода?

МОИ маршруты:

resources :orders do
      get 'order_confirmation', :on => :member
  end

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вот так я решил проблему to_param. Я просто удалил его и реорганизовал маршруты для конкретного маршрута участника .....

При использовании:

  resources :orders, param: :order_token do
      get 'order_confirmation', :on => :member
  end

В моих маршрутах я могу перейти по URL, который я хочу. Хотя после создания заказа он все же направляет меня к маршруту с использованием: id.

Затем я изменяю свое перенаправление на:

redirect_to order_confirmation_order_path(@order.order_token)

И это работает.

Я также удалил переопределение to_param.

0 голосов
/ 08 января 2019

Переопределение именованных параметров маршрута

Вы можете использовать опцию param при определении ресурсов для переопределения идентификатора ресурса по умолчанию. Чтобы иметь разные идентификаторы в зависимости от маршрута, вы можете использовать опции only и except, чтобы указать, какие маршруты включать или исключать соответственно.

Вам нужно будет создать блок resources для каждого идентификатора. Затем вы можете определить, какие маршруты принадлежат какому идентификатору.

Чтобы обновить метод to_param для генерации URL, вам нужно будет указать, в каком действии вы находитесь, и, следовательно, какой идентификатор использовать. Есть много способов сделать это. Вы можете добавить attr_writer :to_param_flag к вашей модели User и установить его в обратном вызове before_action на контроллере. Вы можете сохранить состояние logged_in в User. И есть много других решений, с которыми вы можете поэкспериментировать, чтобы найти то, что лучше всего подходит вашему проекту.

Обновление:

Вы можете определить маршрут несколькими способами. Поскольку существует только один маршрут, вместо использования ресурсов мы можем использовать match. В документации по и ActionDispatch::Routing::Mapper::Base#match и комментариях мы можем видеть опции (включая :param), которые мы можем использовать в match.

Поэтому мы можем сделать:

resources :orders do
  match :order_confirmation, on: :member, param: :order_token, via: :get
end

и поскольку get является псевдонимом для match...via: :get, мы можем сделать:

resources :orders do
  get :order_confirmation, on: :member, param: :order_token
end

Теперь маршрутизация будет осуществляться через /orders/order_confirmation/:order_token, и у контроллера будет доступ к params[:order_token].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...