#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». Просто смоделируйте это, чтобы проверить, действительно ли это вызывает проблему.