1

我正在为我的应用程序开发一个调节功能,它基于一个基本的脚手架结构。我需要的是使用布尔参数publisedon编辑几条记录false。在moderate.html我得到了所有未发布条目的列表,这些条目能够更改它们的参数whichwhat并且published。当我尝试通过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)

[通用-darwin10.0] Rails 2.3.5

Rails 日志moderatecomplete操作:

处理 NamesController#moderate (for 127.0.0.1 at 2010-10-16 21:36:42) [GET] [4;35;1mName Load (0.6ms)[0m [0mSELECT * FROM "names" WHERE ("names". "published" = 'f') [0m 在布局/名称中呈现模板 呈现名称/适度 12 毫秒内完成(查看:7,DB:1)| 200 OK [http://localhost/moderate]

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

NoMethodError(当你没有预料到它时你有一个 nil 对象!你可能期望一个 Array 的实例。在评估 nil.reject 时发生错误):
app/controllers/names_controller.rb:47:in each' app/controllers /names_controller.rb:46:in `完成'complete'
app/controllers/names_controller.rb:46:in

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

4

1 回答 1

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[: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 魔法需要跟踪——这有帮助吗?

于 2010-10-16T16:39:53.833 回答