带有find_by的“ArgumentError Exception:Unknown key”

时间:2012-11-22 15:53:11

标签: ruby-on-rails ruby activerecord

我有优惠券系统,我正在尝试使用coupon方法获取find_by对象:

Coupon.find_by_coupon(params[:coupon])

我收到了这个错误:

ArgumentError Exception: Unknown key: coupon

我确信params[:coupon]是对的:

(rdb:1) eval params[:coupon]
{"coupon"=>"100"}

我有以下型号:

# Table name: coupons
#
#  id              :integer         not null, primary key
#  coupon          :string(255)
#  user_id         :integer

更新:

如果我放Coupon.find_by_coupon(params[:coupon][:coupon])而不是Coupon.find_by_coupon(params[:coupon]),那就行了。

这里是我视图中带有表单的代码:

<%= semantic_form_for Coupon.new, url: payment_summary_table_offers_path(@booking_request) do |f| %>
    <%= f.input :coupon, :as => :string, :label => false, no_wrapper: true %>
    <%= f.action :submit, :as => :button, :label => t(:button_use_coupon), no_wrapper: true,
    button_html: { value: :reply, :disable_with => t(:text_please_wait) } %>
<% end %>

1 个答案:

答案 0 :(得分:2)

如果您使用的是Rails 3,我建议您使用此方法查找对象:

# equivalent of find_all
Coupon.where(:coupon => params[:coupon]) # => Returns an array of Coupons
# equivalent of find :first
Coupon.where(:coupon => params[:coupon]).first # => Returns a Coupon or nil

尝试执行params.inspect以确切了解如何制作哈希值。我认为它是这样构建的:

{ :coupon => { :coupon => '100' } }

如果是,您应该使用params[:coupon][:coupon]来获取字符串'100'

更新后:

semantic_form_for正在为你创建表单,因为你给了他一个Coupon.new它将以这种方式构建params:

params = {
  :coupon => { :attribute_1 => 'value_1', :attribute_2 => 'value_2' }
}

如果您更喜欢使用find_by方法:

Coupon.find_by_coupon(params[:coupon][:coupon]) # => Returns a Coupon or raise a RecordNotFound error

或使用where方法:

Coupon.where(:coupon => params[:coupon][:coupon]).first # => Returns a Coupon or nil