Нет ошибки метода в Ruby - PullRequest
0 голосов
/ 14 января 2011

В настоящее время у меня есть приложения Rails, которые позволяют пользователям перетаскивать определенные элементы веб-страницы и обновляют приложение в зависимости от выбора пользователя.Это делается с помощью помощников Rails и AJAX.Однако я продолжаю сталкиваться с «NoMethodError» в Ruby.

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'})

Есть идеи?

Спасибо,

1 Ответ

0 голосов
/ 14 января 2011

Время на рефакторинг! Вероятно, в методы около одной пятой этого размера.

Я подозреваю, что причиной является functions_for метод, не могли бы вы вставить его определение?

В то же время, некоторые общие предложения:

  • дайте вашим переменным полные имена - user вместо u.
  • вам не нужно хранить flag_changed var, проверять user.changed? (также user._new_record?).
  • у вас должна быть настроена маршрутизация, чтобы вам не нужно было повторно определять объект params.
  • почти никогда не должно быть более пары уровней условных выражений - рефакторинг во внешние методы.
  • Почти наверняка это лучший способ сделать то, что вы делаете, с помощью метода ApplicationController :: send_msg (ведение журнала?). Если вы не можете использовать существующий проект, сделайте его вспомогательным методом в ApplicationController.

Я подозреваю, что вы недавно перешли на язык более низкого уровня? Вы обнаружите, что использование соглашений ruby ​​сэкономит вам много времени и кода.

Просто любопытно, что делает метод _?

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...