注意:这个问题已由我(我)回答,以下信息证明是红鲱鱼。我把它留在这里,以防它帮助某人。请参阅下面的答案!
我正在将所有控制器升级到强参数,而且我遇到了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
答案 0 :(得分:0)
更新答案:事实证明,我没有包括找到答案的关键。问题是在测试中。这些特殊测试旨在确保无法更新交易。
如果没有强参数,可以编写一个测试,传入一个空的参数哈希值进行更新,如果你只是测试它不会更新,只要你单独传入一个就可以正常工作要测试的ID(虽然事后看来,为了确保有东西可能很好)。
ActionController :: TestCase BEFORE:
should "return not found if it can't find the deal" do
put :update, :id => 0, :deal => {}
assert_response :not_found
end
使用强参数,必须在该哈希中包含一些内容。只需使用至少一个属性粘贴其中一个属性即可。这实际上使它成为一个更强大的测试,传递的不仅仅是ID,而且(正如我发现的那样),它需要强大的参数。我没有在任何地方找到这个记录,我希望有一天我会把它留在这里帮助别人。
ActionController :: TestCase AFTER:
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