'Unknown key(s)'ArgumentError

时间:2010-10-16 14:09:36

标签: ruby-on-rails forms params scaffold

我正在为我的应用程序开发一个基于基本脚手架结构的调节功能。我需要的是在publised上使用布尔参数false编辑多个记录。在moderate.html我获取了所有未发布条目的列表,可以更改其参数whichwhatpublished。当我尝试通过complete操作保存更改时,会出现错误。

  

NamesController中的ArgumentError #complete

     

未知密钥:7,1,4

“7,1,4”是我未发表的记录的ID。

以下是我的代码部分:

#names_controller.rb

    def moderate
     @names = Name.find(:all, params[:name_ids], :conditions => {:published => false})
      respond_to do |format|
        format.html { render :action => "moderate" }
         format.xml 
       end
     end

def complete
     @names = Name.find(params[:name_ids])
     @names.each do |name|
       name.update_attributes!(params[:name].reject { |k,v| v.blank? })
     end
     flash[:notice] = "Updated records!"
     redirect_to names_path
   end


#moderate.html.erb
<% form_tag complete_names_path do %>  
  <% @names.each do |name| %>
    <fieldset>
    <% fields_for "name_ids[#{name.id}]", name do |name_fields| %>
    <%= name_fields.text_field :which %>
    <%= name_fields.text_field :what %>
    <%= name_fields.check_box :published %> 
    <% end %>
    </fieldset>   
  <% end %>  
<%= submit_tag "Ok" %>
<% end %>/


#routes.rb
ActionController::Routing::Routes.draw do |map| 
  map.connect 'moderate', :controller => 'names', :action => 'moderate'
  map.resources :names, :collection => { :complete => :put}
  map.root :names
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

我明白,name_ids有问题,但我不明白,我该怎么做。 提前谢谢。

  

ruby​​ 1.8.7(2009-06-12 patchlevel 174)

     

[universal-darwin10.0] Rails 2.3.5

Rails记录moderatecomplete操作:

  
    

处理NamesController #middle(适用于2010-10-16 21:36:42的127.0.0.1)     [GET] [4; 35; 1mName负载(0.6ms)[0m     [0mSELECT * FROM“名称”WHERE     (“名字”。“已发表”='f')[0m     内部渲染模板     布局/名称渲染名称/中等     完成时间12ms(查看:7,DB:1)|     200 OK [http:// localhost / moderate]

  
     

处理NamesController#complete   (2010.10-16 21:36:49为127.0.0.1)   [POST]参数:{“commit”=&gt;“Ok”,   “authenticity_token”=&gt; “中CtmsjIavksOMSIArrdovkkzuZzHVjkenFFMO5bHIvgg =”,   “name_ids”=&GT; { “7”=&GT; { “发表”=&gt; “中0” 时,   “what”=&gt;“Партия”,“which”=&gt;“Крутая”},   “1”=&GT; { “发表”=&gt; “中1”,   “what”=&gt;“Россия”,“which”=&gt;“Единая”},   “4”=&GT; { “发表”=&gt; “中0” 时,   “什么”=&gt; “中Организация”,   “其中”=&gt; “中Молдавская”}}}
  [4; 36; 1mName负载(0.4ms)[0m
  [0; 1mSELECT * FROM“名称”WHERE   (“名字”。“id”IN(7,1,4))[0m

     

NoMethodError(你有一个零对象   当你没想到的时候!你可能会   期待一个Array的实例。   评估时发生错误   nil.reject):
  应用程序/控制器/ names_controller.rb:47:在   complete'
app/controllers/names_controller.rb:46:in
每个'
  应用程序/控制器/ names_controller.rb:46:在   `完整的“

     

渲染救援/ _trace(110.3ms)   渲染救援/ _request_and_response   (0.5ms)渲染救援/布局   (INTERNAL_SERVER_ERROR)

1 个答案:

答案 0 :(得分:2)

可能你需要从name_ids哈希中获取密钥。尝试:

@names = Name.find(params[:name_ids].keys)

另一个问题是你对params [:name]的引用,它是nil。你的意思是(编辑:使用to_s匹配params键,哈哈):

@names.each do |name|
  name.update_attributes!(params[:name_ids][name.id.to_s].reject { |k,v| v.blank? })
end

编辑(简要解释):

发生的事情是你在params,params [:name_ids]中有一个嵌套的哈希。看起来像是:

"name_ids"=>{"7"=>{"published"=>"0", "what"=>"Партия", "which"=>"Крутая"}, "1"=>{"published"=>"1", "what"=>"Россия", "which"=>"Единая"}, "4"=>{"published"=>"0", "what"=>"Организация", "which"=>"Молдавская"}}

ActiveRecord'find'方法可以采用一组id,但不能使用值的哈希值。您最初在此行中提交“查找”的内容:

@names = Name.find(params[:name_ids])

...是params [:name_ids]的值:

{"7"=>{"published"=>"0", "what"=>"Партия", "which"=>"Крутая"}, "1"=>{"published"=>"1", 
"what"=>"Россия", "which"=>"Единая"}, "4"=>{"published"=>"0", "what"=>"Организация", 
"which"=>"Молдавская"}

当你想要的是:

@names = Name.find(['7','1','4'])

这就是调用params [:name_ids] .keys给你的东西。

第二个问题是这一行:

name.update_attributes!(params[:name].reject { |k,v| v.blank? })

params中没有值':name',所以在它上面调用'reject'会导致'no method'错误 - 在nil对象上没有'reject'方法。您想要的是更新与循环中的特定名称对应的“名称”的属性。这意味着你想从params [:name_ids] [:id]中获取值,其中:id是'name'的id。

这一切都可以追溯到fields_for创建params的方式。这一行:

<% fields_for "name_ids[#{name.id}]", name do |name_fields| %>

意味着params将包含一个名为'name_ids'的哈希,其键与name.id相对应,它们本身将包含ActiveRecord可以在update_attributes方法中使用的哈希值。

有很多着名的Rails魔法在那里跟踪 - 这有帮助吗?