【问题标题】:'Unknown key(s)' ArgumentError'未知键' ArgumentError
【发布时间】:2011-04-26 08:09:13
【问题描述】:

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

NamesController#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 补丁级别 174)

[universal-darwin10.0] Rails 2.3.5

moderatecomplete 操作的 Rails 日志:

Processing NamesController#moderate (for 127.0.0.1 at 2010-10-16 21:36:42) [GET] [4;35;1mName 加载 (0.6ms)[0m [0mSELECT * FROM "names" WHERE (“名称”。“已发布”='f')[0m 内的渲染模板 布局/名称渲染名称/适度 在 12 毫秒内完成(查看:7,DB:1)| 200 OK [http://localhost/moderate]

处理名称控制器#complete (127.0.0.1 2010-10-16 21:36:49) [POST] 参数:{"commit"=>"Ok", "authenticity_token"=>"CtmsjIavksOMSIArrdovkkzuZzHVjkenFFMO5bHIvgg=", "name_ids"=>{"7"=>{"已发布"=>"0", "what"=>"Партия", "which"=>"Крутая"}, "1"=>​​{"已发布"=>"1", "what"=>"Россия", "which"=>"Единая"}, "4"=>{"已发布"=>"0", "什么"=>"Организация", "which"=>"Молдавская"}}}
[4;36;1mName 负载 (0.4ms)[0m
[0;1mSELECT * FROM "names" WHERE ("names"."id" IN (7,1,4)) [0m

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

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

【问题讨论】:

    标签: ruby-on-rails forms params scaffold


    【解决方案1】:

    您可能只需要从 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[:name_ids] 中有一个嵌套哈希。它看起来像:

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

    ActiveRecord 的“查找”方法可以采用 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 创建参数的方式开始。这一行:

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

    意味着 params 将包含一个名为“name_ids”的散列,其键对应于 name.id,它本身将包含 ActiveRecord 可以在 update_attributes 方法中使用的属性的散列。

    其中有很多著名的 Rails 魔法需要跟踪——这有帮助吗?

    【讨论】:

    • 这是一条完整的行动吗?它给了我一个错误:“NoMethodError in NamesController#complete 你有一个 nil 对象,但你没想到它!你可能期望一个 Array 的实例。在评估 nil.reject 时发生错误”
    • 这是一个不同的问题。您的 params[:name] 将超过零。 (见编辑)。
    • 戴夫,现在我的“完成”操作看起来像这样,但我仍然遇到同样的 NoMethpd 错误。 "def 完成 @names = Name.find(params[:name_ids].keys) @names.each 做 |name| name.update_attributes!(params[:name_ids][name.id].reject { |k,v| v .blank? }) end flash[:notice] = "更新记录!" redirect_to names_path end"
    • 当该操作失败时,您能否从 Rails 日志中发布该操作的文本?
    • 太棒了,现在可以了!非常感谢您的帮助!如果它不打扰你,你能用几句话解释问题是什么吗?只是为了让像我这样的新手清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    相关资源
    最近更新 更多