2

注: この質問には (私が) 回答済みであり、以下の情報はニシンであることが判明しました。誰かに役立つ場合に備えて、ここに残します。答えは以下をご覧ください!

すべてのコントローラーを強力なパラメーターにアップグレードしていますが、API コントローラーで問題が発生し、ファンキーなタイムゾーン処理を行う必要があります。

強力なパラメーターはdeal_strong_paramsであり、問​​題はそれらを行の2番目の引数として持つことで発生するようdeal_paramsです。そのことをいじるなど、たくさんのことを試しましたが、それはうまくいきActionController::Parameters.new()ませんでした。強力なパラメーターでよくあることですが、予期した応答ではなく 400 エラーが発生します。私は非常に多くのことを試しました。あなたの提案を本当に歓迎します。

API コントローラーからの関連コード:

before_filter :validate_update_params, :only => [:update]
.
. [show method left out]
.
def update
 deal = SuperDeal.find_by_id(params[:id])
 return head :not_found unless deal

 deal_params = convert_time_to_local(deal, deal_strong_params)

 respond_to do |format|
  format.json {
    if deal.update_attributes(deal_params)
      render :text => "Successful update", :status => :created
    else
      render :text => "Unsuccessful update: # {deal.errors.full_messages.join(", ")}", :status => :expectation_failed
     end
   }
 end
end

強力なパラメーター:

def deal_strong_params
 params.require(:deal).permit(:offer_starts_at,:offer_ends_at,:copy_complete,:short_title, { :deal_status_attributes => [:id, :ops_complete_at] })
end

そして、TimeCop で機能する特別な時間式。必要なので含めます:

def convert_time_to_local(deal, deal_params)
 # times are coming in as UTC
 [:offer_starts_at, :offer_ends_at].each do |attribute|
   next unless deal_params[attribute]
   deal_params[attribute] = deal.timezone.parse("#{deal_params[attribute]} UTC")
 end
 deal_params
end
4

1 に答える 1