NoMethodError в Users # показать неопределенный метод `follow 'для # - PullRequest
0 голосов
/ 25 января 2012

Я получаю приведенную ниже ошибку для строки 8. Учимся на гл.11 / 12 railstutorial.org. Я использую рельсы 3.1.3 и ruby ​​1.9.3 вместо того, что было предложено в руководстве. Я искал других с той же ошибкой и не смог найти другой пример этой проблемы. Все еще новичок в рельсах, и это мой первый пост. Пожалуйста помоги! Научи меня, что я пропустил. Спасибо!

NoMethodError в Users # show

undefined method `following' for #<User:0xab068f0>

Извлеченный источник (около строки № 8):

5:       <td>
6:         <a href="<%= following_user_path(@user) %>">
7:           <span id="following" class="stat">
8:             <%= @user.following.count %> following
9:           </span>
10:         </a>
11:       </td>

Трассировка включения шаблона: app / views / users / show.html.erb

app/views/shared/_stats.html.erb:8:in `_app_views_shared__stats_html_erb__794775909_89084750'
app/views/users/show.html.erb:32:in `_app_views_users_show_html_erb__961188432_91976190'

Полная трассировка:

activemodel (3.1.3) lib/active_model/attribute_methods.rb:385:in `method_missing'
activerecord (3.1.3) lib/active_record/attribute_methods.rb:60:in `method_missing'
app/views/shared/_stats.html.erb:8:in `_app_views_shared__stats_html_erb__794775909_89084750'

show.html.erb

31: <%= render 'shared/stats' %>
32: <%= render 'shared/user_info' %>

_stats.html.erb

<% @user ||= current_user %>
<div class="stats">
  <table summary="User stats">
    <tr>
      <td>
        <a href="<%= following_user_path(@user) %>">
          <span id="following" class="stat">
            <%= @user.following.count %> following
          </span>
        </a>
      </td>
      <td>
        <a href="<%= followers_user_path(@user) %>">
          <span id="followers" class="stat">
            <%= pluralize(@user.followers.count, "follower") %>
          </span>
        </a>
      </td>
    </tr>
  </table>
</div>

Модели / relationship.rb

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

   belongs_to :follower, :class_name => "User"
   belongs_to :followed, :class_name => "User"

   validates :follower_id, :presence => true
   validates :followed_id, :presence => true

end

дб / мигрировать /..._ create_relationships.rb

class CreateRelationships < ActiveRecord::Migration
  def self.up
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps
    end
    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], :unique => true
  end

  def self.down
    drop_table :relationships
  end
end

Редактировать: вот файл user.rb

require 'digest'
class User < ActiveRecord::Base

attr_accessor :password
attr_accessible :first_name, :last_name, :email, :password, 
                :salt, :password_confirmation, :zip_id, 
                :country, :birthdate, :gender, :photo



     #paperclip
  has_attached_file :photo, 
      :default_url => ":rails_root/public/images/default.png",
      :url => "/images/user_photos/:id/:style/:basename.:extension",
      :path => ":rails_root/public/images/user_photos/:id/:style/:basename.:extension",
      :styles => { 
        :thumb => "150x150",
        :small  => "250x250" }  

validates_attachment_size :photo, :less_than => 5.megabytes
validates_attachment_content_type :photo, :content_type => ['image/jpeg', 'image/png']

    # associates microposts to users.  The second part will destroy all posts by this user if you destroy the user
    has_many :microposts, :dependent => :destroy

  def feed
    Micropost.from_users_followed_by(self)    
  end

  has_many :reverse_relationships, :foreign_key => "followed_id",
                                   :class_name => "Relationship",
                                   :dependent => :destroy
  has_many :followers, :through => :reverse_relationships, :source => :follower


  def following?(followed)
    relationships.find_by_followed_id(followed)
  end

  def follow!(followed)
    relationships.create!(:followed_id => followed.id)
  end

  def unfollow!(followed)
    relationships.find_by_followed_id(followed).destroy
  end




email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

validates :first_name,  :presence => true,
                        :length   => { :maximum => 30 }
validates :last_name,   :presence => true,
                        :length   => { :maximum => 30 }
validates :email,       :presence => true,
                        :format   => { :with => email_regex },
                        :uniqueness => { :case_sensitive => false },
                        :length   => { :maximum => 50 }
validates :zip_id,      :presence => true,
                        :length       => { :within => 5..5 }, :numericality => true

validates :password,    :presence => true,
                        :length       => { :within => 6..40 },
                        :confirmation => true                       
  before_save :encrypt_password

  def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
  end

  def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil  if user.nil?
    return user if user.has_password?(submitted_password)
  end

  private

    def encrypt_password
      self.salt = make_salt unless has_password?(password)
      self.encrypted_password = encrypt(password)
    end

    def encrypt(string)
      secure_hash("#{salt}--#{string}")
    end

    def make_salt
      secure_hash("#{Time.now.utc}--#{password}")
    end

    def secure_hash(string)
      Digest::SHA2.hexdigest(string)
    end

    def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil  if user.nil?
    return user if user.has_password?(submitted_password)
  end

  def self.authenticate_with_salt(id, cookie_salt)
    user = find_by_id(id)
    (user && user.salt == cookie_salt) ? user : nil
  end


end

Вот следующее / последователи от: controllers / users_controller.rb

  def following
    @title = "Following"
    @user = User.find(params[:id])
    @users = @user.following.paginate(:page => params[:page])
    render 'show_follow'
  end

  def followers
    @title = "Followers"
    @user = User.find(params[:id])
    @users = @user.followers.paginate(:page => params[:page])
    render 'show_follow'
  end

Ответы [ 2 ]

1 голос
/ 25 января 2012

Во-первых, 3.1.3 - это версия Rails, а 1.8.7 - версия Ruby, а не Rails.Вы должны исправить это.И в модели user нет метода following в соответствии с тем, что вы разместили в вопросе.Существует только метод following?(followed) и другие методы, но нет метода following.

Я думаю, что вам не хватает этой части в вашем классе User:

class User < ActiveRecord::Base
  .
  has_many :following, :through => :relationships, :source => :followed
  .
end

См. Раздел 12,11 онлайн книги для более подробной информации.

После добавления этой строки и с этого момента @user будет иметь метод #following для вызова, вы можете сказать @user.following.count, и он не выдаст ошибку.

0 голосов
/ 17 апреля 2014

Просто изменить

<a href="<%= following_user_path(@user) %>"> 

до

<a href="<%= followings_user_path(@user) %>">.

Это работает для меня, поскольку я получаю ту же ошибку. Проверьте ваши маршруты .rb также должно

. .

root  to: 'static_pages#home'
  resources :users do
    member do
      get :followings, :followers
    end
  end
  resources :sessions, only: [:new, :create, :destroy]
  resources :microposts, only: [:create, :destroy]
  resources :relationships, only: [:create, :destroy]
...