我正在为我的应用程序开发一个基于基本脚手架结构的调节功能。我需要的是在publised
上使用布尔参数false
编辑多个记录。在moderate.html
我获取了所有未发布条目的列表,可以更改其参数which
,what
和published
。当我尝试通过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记录moderate
和complete
操作:
处理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))[0mNoMethodError(你有一个零对象 当你没想到的时候!你可能会 期待一个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)
答案 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魔法在那里跟踪 - 这有帮助吗?