Переадресация контроллера Rails для формирования в другом контроллере и возврата к сохраненной модели
Мне нужно сделать что-то странное в моем приложении на Rails. Когда пользователь создает экземпляр Product через действие create, мне нужно его сохранить, а затем перенаправить в форму оплаты Braintree, если они еще не добавили его в свою учетную запись, и только затем перенаправить на страницу показа для товар.
Вот действие создать продукт:
def create
@product = Product.new(product_params)
@product.set_user!(current_user)
if @product.save
if !current_user.braintree_customer_id?
redirect_to "/customer/new"
else
redirect_to view_item_path(@product.id)
end
else
flash.now[:alert] = "Woops, looks like something went wrong."
format.html {render :action => "new"}
end
end
Метод подтверждения для контроллера клиента Braintree таков:
def confirm
@result = Braintree::TransparentRedirect.confirm(request.query_string)
if @result.success?
current_user.braintree_customer_id = @result.customer.id
current_user.customer_added = true
current_user.first_name = @result.customer.first_name
current_user.last_name = @result.customer.last_name
current_user.save!
redirect_to ## not sure what to put here
elsif current_user.has_payment_info?
current_user.with_braintree_data!
_set_customer_edit_tr_data
render :action => "edit"
else
_set_customer_new_tr_data
render :action => "new"
end
end
Возможно ли то, что я хочу сделать?
1 ответ
Вы можете сохранить идентификатор продукта в переменной сеанса перед перенаправлением в форму braintree, а затем после полного подтверждения просто прочитать этот идентификатор из сеанса и перенаправить на действие показа продукта.
if !current_user.braintree_customer_id?
session[:stored_product_id] = @product.id
redirect_to "/customer/new"
else
redirect_to view_item_path(@product.id)
end
Имейте в виду, что пользователь может открыть страницу просмотра продукта, просто введя действительный URL-адрес, если он знает идентификатор продукта, поэтому вам также следует разобраться с подобной ситуацией. Вы можете поместить before_filter в действие продукта, чтобы проверить, есть ли у пользователя настройка дерева мозга. Если вы идете по этому пути, вам не нужно иметь условие при создании действия. Вы всегда можете перенаправить на страницу показа продукта, и before_filter проверит, нужно ли пользователю обновить данные Braintree.