1

基本的なスキャフォールド構造に基づいた、アプリケーションのモデレート機能に取り組んでいます。必要なのは、のブールパラメータを使用していくつかのレコードを編集することpublisedですfalse。で、パラメータをmoderate.html変更できるすべての未公開エントリのリストを取得しています。アクションを通じて変更を保存しようとすると、エラーが表示されます。whichwhatpublishedcomplete

NamesController#completeのArgumentError

不明なキー: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理解していますが、どうすればよいかわかりません。前もって感謝します。

ルビー1.8.7(2009-06-12パッチレベル174)

[universal-darwin10.0] Rails 2.3.5

Railsのログmoderatecompleteアクション:

NamesController#moderateの処理(2010-10-16 21:36:42の127.0.0.1の場合)[GET] [4; 35; 1mName Load(0.6ms)[0m [0mSELECT * FROM "names" WHERE("names"。 "published" ='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" => "Ok"、 "authenticity_token" => "CtmsjIavksOMSIArrdovkkzuZzHVjkenFFMO5bHIvgg ="、 "name_ids" = > {"7" => {"published" => "0"、 "what" => "Партия"、 "which" => "Крутая"}、 "1" => {"published" => "1" 、"what" => "Россия"、 "which" => "Единая"}、 "4" => {"published" => "0"、 "what" => "Организация"、 "which" => " Молдавская"}}}
[4;36; 1mName Load(0.4ms)[0m
[0; 1mSELECT * FROM" names "WHERE("names"。"id "IN(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'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)

別の問題は、nilであるparams [:name]への参照です。意味しましたか(編集: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の「find」メソッドはIDの配列を受け取ることができますが、値のハッシュを受け取ることはできません。この行の「find」に最初に送信したもの:

@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を呼び出すと得られるものです。

2番目の問題はこの行でした:

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

paramsに値「:name」がなかったため、「reject」を呼び出すと「nomethod」エラーが発生します。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 に答える