2016-03-01 42 views
1

我想從railstutorial修改邁克爾·哈特爾示例應用程序。Rails匹配? attribute_missing(匹配,*指定參數時,與塊):超級,NoMethodError在StaticPagesController#家

我static_pages控制器看起來像這樣:

class StaticPagesController < ApplicationController 

    def home 
    if logged_in? 
     @micropost = current_user.microposts.build 
     @feed_items = current_user.feed.paginate(page: params[:page]) 
    end 
    end 

    def help 
    end 

    def about 
    end 

    def contact 
    end 
end 

和林歌廳錯誤mesage這樣的:

NoMethodError in StaticPagesController#home 
undefined method `microposts' for #<User:0x00000004d39d58> 

else 
    match = match_attribute_method?(method.to_s) 
    match ? attribute_missing(match, *args, &block) : super 
    end 
end 

用戶模型:

class User < ActiveRecord::Base 
    has_many :listings, :class_name => "Micropost", :foreign_key => "seller_id", dependent: :destroy 
    has_many :bids, foreign_key: "bidder_id" 
    has_many :active_relationships, class_name: "Relationship", 
           foreign_key: "follower_id", 
           dependent: :destroy 
    has_many :passive_relationships, class_name: "Relationship", 
           foreign_key: "followed_id", 
           dependent: :destroy 
    has_many :following, through: :active_relationships, source: :followed 
    has_many :followers, through: :passive_relationships, source: :follower 
    attr_accessor :remember_token, :activation_token, :reset_token 
    before_save :downcase_email 
    before_create :create_activation_digest 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, 
       format: { with: VALID_EMAIL_REGEX }, 
       uniqueness: {case_sensitive: false} 
    has_secure_password 
    validates :password, length: { minimum: 6 }, allow_blank: true 

    def to_s 
    self.name 
    end 

    # Returns the hash digest of the given string. 
    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
               BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    # Returns a random token. 
    def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

# Remembers a user in the database for use in persistent sessions. 
def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
end 

    # Returns true if the given token matches the digest. 
    def authenticated?(attribute, token) 
    digest = send("#{attribute}_digest") 
    return false if digest.nil? 
    BCrypt::Password.new(digest).is_password?(token) 
    end 

    # Forgets a user. 
    def forget 
    update_attribute(:remember_digest, nil) 
    end 

    # Activates an account. 
    def activate 
    update_attribute(:activated, true) 
    update_attribute(:activated_at, Time.zone.now) 
    end 

    # Sends activation email. 
    def send_activation_email 
    UserMailer.account_activation(self).deliver_now 
    end 

# Sets the password reset attributes. 

    def create_reset_digest 
    self.reset_token = User.new_token 
    update_attribute(:reset_digest, User.digest(reset_token)) 
    update_attribute(:reset_sent_at, Time.zone.now) 
    end 

    # Sends password reset email. 
    def send_password_reset_email 
    UserMailer.password_reset(self).deliver_now 
    end 



    # Returns true if a password reset has expired. 
    def password_reset_expired? 
    reset_sent_at < 2.hours.ago 
    end 

    def show 
    @user = User.find(params[:id]) 
    @microposts = @user.microposts.paginate(page: params[:page]) 
    end 



    # Defines a proto-feed. 
    # See "Following users" for the full implementation. 
    # Returns a user's status feed. 
    def feed 
    following_ids = "SELECT followed_id FROM relationships 
        WHERE follower_id = :user_id" 
    Micropost.where("seller_id IN (#{following_ids}) 
        OR seller_id = :seller_id", seller_id: id) 
    end 

    # Follows a user. 
    def follow(other_user) 
    active_relationships.create(followed_id: other_user.id) 
    end 

    # Unfollows a user. 
    def unfollow(other_user) 
    active_relationships.find_by(followed_id: other_user.id).destroy 
    end 

    # Returns true if the current user is following the other user. 
    def following?(other_user) 
    following.include?(other_user) 
    end 

    private 

# Converts email to all lower-case. 
def downcase_email 
    self.email = email.downcase 
end 

# Creates and assigns the activation token and digest. 
def create_activation_digest 
    self.activation_token = User.new_token 
    self.activation_digest = User.digest(activation_token) 
end 
end 

用戶控制器

我不知道是這個問題的控制器實現或意見或meybe微觀柱的實施有關。請gyus幫助完成軌道小白

回答

0

第一行中的模式是:

class User < ActiveRecord::Base 
    has_many :listings, :class_name => "Micropost", :foreign_key => "seller_id", dependent: :destroy 

在用戶模式,你應該有:

class User < ActiveRecord::Base 
    has_many :microposts, dependent: :destroy 
0

您已經定義:

has_many :listings, :class_name => "Micropost", :foreign_key => "seller_id" 

所以,你必須使用:

@micropost = current_user.listings.build 

,而不是您的:

@micropost = current_user.microposts.build 

原因是Rails的需要:listings作爲關係的 '正式名'。 如果指定:class_name => "Micropost" - 爲Rails這意味着實際名。 因此,您可以使用盡可能多的官方名稱,只要您有一個實際的依賴關係。