注: この質問には (私が) 回答済みであり、以下の情報はニシンであることが判明しました。誰かに役立つ場合に備えて、ここに残します。答えは以下をご覧ください!
すべてのコントローラーを強力なパラメーターにアップグレードしていますが、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