注意:这个问题(我)已经回答了,下面的信息只是转移注意力。我把它留在这里,以防它帮助到别人。请参阅下面的答案!
我正在将我的所有控制器升级到强参数,并且我遇到了API控制器的问题,我不得不做一些奇怪的时区事情。
强参数是deal_strong_params
,问题似乎是将它们作为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
更新答案:原来我没有包括找到答案的关键。问题出在测试上。这些特殊的测试是为了确保交易不会被更新。
如果没有强参数,可以编写一个测试,传入一个空的参数哈希来更新,如果你只是测试它不更新,只要你传入一个单独的id来测试,这就可以了(尽管事后看来,最好有一些东西来确保)。
ActionController::测试用例之前:
should "return not found if it can't find the deal" do
put :update, :id => 0, :deal => {}
assert_response :not_found
end
对于强参数,必须在该散列中包含一些内容。只需将其中一个属性与至少一个属性粘在一起即可。这实际上使它成为一个更健壮的测试,通过的测试比ID多,但此外(正如我所发现的),它需要强大的参数。我在任何地方都没有发现这个文档,我希望有一天我把它留在这里能对别人有所帮助。
ActionController::之后的测试用例
should "return not found if it can't find the deal" do
put :update, :id => 0, :deal => { :copy_complete => true } #NOTE: Strong params doesn't allow an empty :deal => {}
assert_response :not_found
end