2011-01-14 4 views
0

私は現在、ユーザがウェブページの特定の要素をドラッグアンドドロップし、ユーザの選択に基づいてアプリケーションを更新することを可能にするRailsアプリケーションを持っています。これは、RailsヘルパーとAJAXの助けを借りて行われます。しかし、私はRubyで "NoMethodError"を実行し続けます。ルビーのメソッドエラーなし

NoMethodError in ProjectsController#member_change 

undefined method `symbolize_keys' for nil:NilClass 

ここでは、呼び出されているメソッドがあります。私のトレースは、エラーがこの行で発生していることを述べている:

before = u.functions_for(r.authorizable_id) 
       u.roles << r unless u.roles.include? r 
       u.save 
       flag_changed = true 
       after = u.functions_for(r.authorizable_id) 

そして、ここで機能が

def member_change 
    flag_changed = false 
    params['u'] =~ /role_(\d+)_user_(\d+)/ 
    drag_role_id = $1 
    user_id = $2 
    params['r'] =~ /role_(\d+)/ 
    drop_role_id = $1 
    if u=User.find(user_id) 
     if r=Role.find(drop_role_id) 
     if drag_role_id.to_i !=0 and old_r=Role.find(drag_role_id) 
      if drag_role_id == drop_role_id #fom A to A => nothing happen 
      flash.now[:warning] = _('No Operation...') 
      elsif r.authorizable_id == old_r.authorizable_id #the same project? 
      old_r.users.delete(u) 
      unless old_r.valid? 
       flash.now[:warning] = _('Group "Admin" CAN NOT be EMPTY.') 
       old_r.users << u #TODO: better recovery 
       member_edit #if flag_changed 
       render :action => :member_edit, :layout => 'module_with_flash' 
       return 
      end 
      old_r.save 
      r.users << u unless r.users.include? u 
      r.save 
      flag_changed = true 
      before = u.functions_for(r.authorizable_id) 
      after = u.functions_for(r.authorizable_id) 
      added = after - before 
      removed = before - after 
      added.each do |f| 
       ApplicationController::send_msg(:function,:create, 
               {:function_name => f.name, 
               :user_id => u.id, 
               :project_id => r.authorizable_id 
               }) 
      end 
      removed.each do |f| 
       ApplicationController::send_msg(:function,:delete, 
               {:function_name => f.name, 
               :user_id => u.id, 
               :project_id => r.authorizable_id 
               }) 
      end 
      flash.now[:notice] = _('Move User to Group') + " #{ r.name }" 
      else 
      flash.now[:warning] = 
       _('You can\'t move User between Groups that belong to different Projects.') 
      end 
     else 
      before = u.functions_for(r.authorizable_id) 
      u.roles << r unless u.roles.include? r 
      u.save 
      flag_changed = true 
      after = u.functions_for(r.authorizable_id) 
      added = after - before 
      added.each do |f| 
      ApplicationController::send_msg(:function,:create, 
              {:function_name => f.name, 
               :user_id => u.id, 
               :project_id => r.authorizable_id 
              }) 
      end 
      flash.now[:notice] = _('Add User into Group') + " #{ r.name }" 
     end 
     else 
     flash.now[:warn] = _('Group doesn\'t exist!') + ": #{ r.name }" 
     end 
    else 
     flash.now[:warning] = _('User doesn\'t exist!') + ": #{ u.login }" 
    end 
    member_edit #if flag_changed 
    render :action => :member_edit, :layout => 'module_with_flash' 
    end 

と呼ばれ、JavaScriptが

jQuery('#RemoveThisMember').droppable({accept:'.RolesUsersSelection', drop:function(ev,ui){ 
    if (confirm("This will remove User from this Group, are you sure?")) 
    {jQuery.ajax({data:'u=' + encodeURIComponent(jQuery(ui.draggable).attr('id')), success:function(request){jQuery('#module_content').html(request);}, type:'post', url:'/of/projects/11/member_delete'});} 
    }, hoverClass:'ProjectRoleDropDelete_active'}) 

任意のアイデアを関数を呼び出すために使用されていますか?

ありがとう、

答えて

0

リファクタリングする時間!おそらくそのサイズの約5分の1の方法になります。

functions_forメソッドが原因であると思われますが、その定義を貼り付けることはできますか?

平均時間では、いくつかの一般的な提案:

  • はあなたの変数フルネーム与える - userの代わりuを。
  • あなたはflag_changedのvarを保持する必要はありません、user.changedを確認しますか? (またuser._new_record?)。
  • paramsオブジェクトを正規表現する必要がないようにルーティングを設定する必要があります。
  • ほとんどの場合、2つ以上のレベルの条件 - リファクタリングを外部メソッドに含めるべきではありません。
  • これは、あなたがApplicationController :: send_msgメソッド(ロギング?)を使って何をしているかを確認するための良い方法です。既存のプロジェクトを使用できない場合は、ApplicationControllerでヘルパーメソッドにします。

あなたは最近、はるかに低レベルの言語から切り替えたと思いますか?あなたはルビーの慣習を受け入れることで、多くの時間とコードを節約できます。

ちょっと不思議なことに、_メソッドは何をしていますか?

希望すると便利です。

+0

残念ながら、それは私の選択肢ではありません。 – TheRealVayne

+0

本当にかなり役に立ちました。私はあなたの提案に従い、何かが変化するかどうかを見ます。 – TheRealVayne

関連する問題