Ошибка именования в контроллере - PullRequest
2 голосов
/ 04 декабря 2010

Я получаю эту ошибку при попытке создать запись в моей таблице соединений

NameError in SubscriptionsController # новый

неинициализированная константа Канал :: ChannelsUser

Контроллер подписок

class SubscriptionsController < ApplicationController

  helper_method :current_user_session, :current_user
  filter_parameter_logging :password, :password_confirmation

  def new
    @channel = Channel.find(params[:channel_id])
    @user = current_user
    @channel.subscribers << @user
    @channel.save
    flash[:notice] = "You have subscribed to: " +@channel.name
    redirect_to @channel
  end

end

конец

Модель пользователя

class User < ActiveRecord::Base

  acts_as_authentic

  ROLES = %w[admin  moderator subscriber]

  #Each user can subscribe to many channels
  has_many :channels_users
  has_many :subscriptions, :class_name => "Channel", :through => :channels_users

  #Each user who is a moderator can moderate many channels
  has_many :channel_mods
  has_many :channels, :through => :channel_mods

  #Each user can receive many messages
  has_many :messages_users , :dependent => :destroy
  has_many :reciepts , :class_name => "User", :through => :messages_users

  #Filter users by role(s)
  named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0 "} }

  def roles  
    ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }  
  end

  def roles=(roles)  
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum  
  end

  def role_symbols
    role.map do |role|
      role.name.underscore.to_sym
    end
  end

end

Модель канала

class Channel < ActiveRecord::Base
  #Each channel owns many or no messages
  has_many :messages
  #Each channel is own by one moderator
  has_many :channel_mods
  has_many :moderators, :class_name =>'User', :through =>:channel_mod
  #Each channel can have and belong to many or no users
  has_many :channels_users
  has_many :subscribers, :class_name => 'Users' , :through => :channels_users

end

ChannelsUsers model

class ChannelsUsers < ActiveRecord::Base
  belongs_to :user
  belongs_to :channel
end

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Это выглядело бы намного лучше, если бы вы изменили модель на ChannelUser.Вот соответствующие отношения:

class Channel < ActiveRecord::Base
  has_many :channel_users
  has_many :users, :through => :channel_users
end

class User < ActiveRecord::Base
  has_many :channel_users
  has_many :channels, :through => :channel_users
end

class ChannelUser < ActiveRecord::Base
  belongs_to :channel
  belongs_to :user
end

Ваша таблица соединения будет называться channel_users.Я думаю, что вы назвали его channels_users изначально, потому что это настройка для таблицы соединений has_and_belongs_to_many.Но поскольку вы используете has_many :through, вы можете называть таблицу так, как вам нравится.

Ранее в этом году я написал статью в блоге, в которой подробно рассматриваются все варианты:

Основные ассоциации «многие ко многим» в Rails

Надеюсь, это поможет!

1 голос
/ 04 декабря 2010

Имя класса пользователя вашего канала множественное число. Предполагается, что это единственное число.

Так что вы можете перейти на это:

class ChannelsUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :channel
end

или измените эту строку в User и Channel модели:

has_many :channels_users

до

has_many :channels_users, :class_name => 'ChannelsUsers'

Rails будет использовать такие методы, как String#classify и String#underscore для обнаружения классов и отношений.

Если вы хотите поиграться с именами, в консоли опробуйте различные комбинации:

>> "channels_users".classify
=> "ChannelsUser"
>> "ChannelsUser".underscore
=> "channels_user"    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...