Проблема: У меня есть контроллер, в котором я хочу разделить действие обновления на 3 отдельных действия обновления ... Обновление для всех параметров (за исключением других действий обновления), обновление для изменения статуса заказа (создано, отменено, начислено) и обновление для начисления (начисление происходит только после загрузки файла в заказ)
Вопрос: Можете ли вы помочь мне направить и указать, по какому маршруту я долженсобираетесь выполнить это?
Как мне сделать это наиболее эффективным и "правильным" способом?
Должен ли я создать еще 2 контроллера (так какМне нужно 3 обновления), одно для изменения статуса заказа, другое для начисления платы, и они должны наследовать OrderController?
Или есть способ иметь 3 действия обновления в одном контроллере?Я попробовал это, но не мог понять это
Вот как я «решил» это, но, кажется, он не работает слишком гладко, как иногда я замечаю, когда я загружаюфайл в порядке, он начинает зацикливаться и / или занимает больше времени, чем просто все это при одном определенном методе param:
def update
respond_to do |format|
if @order.update(order_status)
if user_signed_in?
format.html { redirect_to ([@user, @order]), notice: 'Order was successfully order_status.' }
format.json { render :show, status: :ok, location: @order }
else
format.html { render :edit }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
if @order.update(order_charge)
@amount = (@order.order_price).to_i * 100
@amount_seller = (@order.order_price).to_i * 75
if @order.update(order_charge)
if current_user.seller?
charge = Stripe::Charge.create({
:amount => @amount,
:description => 'Rails Stripe customer',
:currency => 'usd',
:customer => @order.stripe_customer_token,
:destination => {
:amount => @amount_seller ,
:account => (@order.seller.stripe_token),
}
})
@order.order_status = "charged"
format.html { redirect_to ([@user, @order]), notice: 'Order was successfully uploaded.' }
format.json { render :show, status: :ok, location: @order }
else
format.html { render :edit }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
if @order.update(order_params)
if user_signed_in?
format.html { redirect_to ([@user, @order]), notice: 'Order was successfully updated.' }
format.json { render :show, status: :ok, location: @order }
else
format.html { render :edit }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
if buyer_signed_in?
format.html { redirect_to ([@user, @order]), notice: 'Order was successfully updated.' }
format.json { render :show, status: :ok, location: @order }
else
format.html { render :edit }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
end
private
def set_order
@order = Order.find(params[:id])
end
def order_params
params.require(:order).permit(:name, :email, :image, :video, :description)
end
def order_status
params.require(:order).permit(:order_status)
end
def order_charge
params.require(:order).permit(:video)
end
...
end
Это технически работает, но не совсем быстро, или как я хочу.Когда я загружаю видео, оно дает мне сообщение order_status, потому что я меняю статус заказа, когда видео загружается.Но он все еще работает в том смысле, что создается заряд.
Кто-нибудь когда-либо создавал приложение, в котором ему требовалось несколько действий по обновлению под одним контроллером и моделью, и находил лучший способ сделать это?
Несмотря на то, что вышеприведенный код «работает», мне сказали, что он неэффективен, и мне нужно создать еще 2 контроллера, чтобы выполнить то, что я хочу сделать.Я подумал, что приду сюда, прежде чем обнародовать это, чтобы узнать мнение других людей на основе их опыта, если у них были похожие приложения с этой проблемой.
Или, может быть, помимо вышеупомянутых 1 и 2, у вас есть большеидеи?
(Операция обновления, описанная выше, не завершена, например, order_status. Но меня больше всего беспокоит то, как я должен это делать.)