Issue : я переключил свой "to_param
", чтобы переопределить мою идентификационную информацию. Я перебираю приложение, чтобы использовать токен вместо идентификатора, но у меня проблемы с одним контроллером.
У меня есть OrdersController для создания заказов и VideosController, который используется для загрузки видео и принадлежит заказу.
Моя форма :
<%= form_for([@order, @video_order]) do |form| %>
<%= form.file_field :video, class: "upload" %>
<%= form.submit %>
<% end %>
Я также пытался использовать скрытое поле для @order.id
для :order_id
.
Создание контроллеров :
def create
@video_order = VideoOrder.new(video_order_params)
@order = Order.find_by(order_token: params[:order_token])
@video_order.order_id = @order.id *#line_of_error*
respond_to do |format|
if @order.video_order.present?
format.html { redirect_to @order, notice: 'Already complete.' }
format.json { render :show, status: :created, location: @video_order }
else
if @video_order.valid?
begin
#stripe_charge_code
if @video_order.save
#redirect_code
end
end
end
end
end
end
end
Когда я иду на загрузку, я получаю сообщение об ошибке :
undefined method `id' for nil:NilClass
Конечно, есть идентификатор для @order
. Разве он не должен быть в состоянии найти его, даже если он нашел через :order_token
?
На странице ошибки отображается :
"order_id"=>"myG-xffgHUooKrHkg4xgC59tfI_bESGjLHDIQQ"
который является: order_token для заказа
Это, вероятно, из-за моих маршрутов, которые выглядят так :
resources :orders, param: :order_token
resources :orders do
resources :video_orders
end
Я также пытался добавить "param: order_token" к сложенным ресурсам, но это не сработало. Кроме того, если я возьму "param: order_token", страница не будет загружаться, потому что она ищет order_token. --- это из-за моей модели заказов ...
Заказ модели (резюме):
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
has_one :video_order
Модель заказа видео:
belongs_to :order
validates :order_id, uniqueness: true
Где я тут ошибаюсь?
Почему маркер order_token передается как order_id?
Почему он не находит @ order.id?
Есть ли способ ограничить переопределение моего to_param
только указанными методами - я действительно хочу его только для моего метода orders_confirmation?
Как я могу решить эту проблему?
Все работало отлично, прежде чем я обновил модель заказа, добавив токен (как order_token) и обновил маршруты заказов.