API的强参数

时间:2015-02-26 02:17:06

标签: api timezone nested-attributes strong-parameters timecop

注意:这个问题已由我(我)回答,以下信息证明是红鲱鱼。我把它留在这里,以防它帮助某人。请参阅下面的答案!

我正在将所有控制器升级到强参数,而且我遇到了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

1 个答案:

答案 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