Ошибка членства в группе, из-за которой я вырываю волосы

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

Я получаю эту ошибку:

2011-04-09T18:13:17 00:00 app[web.1]: NameError (неинициализированная постоянная Group::Membership): 2011-04-09T18:13:17 00:00 app[web.1]: app / controllers /group_controller.rb:25: в `show_members’

Когда я пытаюсь использовать метод Show_members в контроллере групп. Что я сделал не так?

user.rb

 class User < ActiveRecord::Base
  require 'paperclip'
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable
  has_and_belongs_to_many :roles
  has_many :articles
  has_many :ratings
  has_many :rated_articles, :through => :ratings, :source => :articles
  has_many :memberships, :dependent => :destroy
  has_many :groups, :through => :memberships
  ...
  

membership.rb

 class Membership < ActiveRecord::Base
  attr_accessible :user_id, :group_id
  belongs_to :user
  belongs_to :group
  validates_uniqueness_of :user_id, :message => "You can only join one group!"
end
  

group.rb

 class Group < ActiveRecord::Base
  require 'paperclip'
  attr_accessible :name, :group_admin, :about, :location, :created_at, :avatar
  validates_uniqueness_of :name, :group_admin
  validates_length_of :name, :in => 4..40
  has_many :memberships, :dependent => :destroy
  has_many :users, :through => :memberships
end 
  

group_controller

 def show_members # members page
    @group = Group.find(params[:id])
    @members = @group.users    <= THIS LINE IS THE ERROR
    @group_admin = User.find(@group.group_admin)
    respond_to do |format|
      format.html
      format.xml  { render :xml => @group }
    end
  end
  

Обновить

 def remove_user
    @membership = Membership.find(params[:user_id, :group_id])
    @membership.destroy
    authorize! :remove_user, @membership
    respond_to do |format|
        format.html { redirect_to(:back, :notice => 'User was successfully Removed.') }
      format.xml  { head :ok }
    end
  

У меня есть это действие в groups_controller, связанное с show_members.html.erb
может ли ошибка быть вызвана этим?

Комментарии:

1. Пожалуйста, ограничьте теги, которые вы используете для публикации, чтобы они были связаны только с используемым вами языком программирования.

2. о, моя ошибка, для чего тогда предназначена группа?

Ответ №1:

Боже мой. Я только что проверил журналы git. По-видимому, git по какой-то причине решил не добавлять файл модели членства в репозиторий, несмотря на то, что я выполняю git commit -a -m «бла». Я думал, что флаг -a добавил все?

Комментарии:

1. вам действительно следует git add . (или git add -p , если вы хотите добавить только некоторые вещи), а не git commit -a

Ответ №2:

Я не вижу ошибки в вставленном вами коде, но, судя по полученному вами коду ошибки, у вас должно быть где-то постоянное значение, к которому невозможно получить доступ. Есть ли у вас какая-либо группа.Вызов членства где-то в вашем коде? (может быть, модуль?) Может быть, вы имели в виду написать group.membership или что-то в этомроде. Я действительно не могу обнаружить ничего другого :/

Редактировать :

Кстати, я вижу кое-что, что также должно вызывать проблему :

 @group_admin = User.find(@group.group_admin)
  

group.admin — это имя, которое я вижу в ваших проверках, и вы ищете идентификатор. В этом должно быть find_by_group_admin.

Комментарии:

1. Если вы удалите строку, которая, по-видимому, вызывает проблему, вы не получите ту же ошибку?

2. Что это за строка? авторизация! :remove_user, @membership. Пожалуйста, удалите ее для проверки и повторите попытку. Вы получаете ошибку?

3. Ну, если бы я удалил эту строку, это нарушило бы show_members.html.erb, поскольку в этом представлении есть много переменных, доступ к которым возможен только при наличии пользователей в текущей группе. Я добавил действие remove_members к своему вопросу.

4. Я использую can can для проверки авторизации. Это не ошибка, но я удалю ее и попробую снова.

5. Леон, тогда не удаляй невинную строку. Замените на что-то вроде «@members = Group.first.users». Просто смоделируйте это, чтобы проверить, действительно ли это вызывает проблему.