2014-05-15 36 views
0

我一直在Rails 4中開發一個Web應用程序,並且使用了Michael Hartl教程作爲它的主幹,但也使用了Devise。在構建了它之後,我回過頭來將Status模型更改爲多態,以便用戶,場地和組能夠發佈狀態。到目前爲止,我已經有了一定的方式,但現在我陷入困境。當試圖查看用戶的個人資料,我目前正在此錯誤:多態地位協會

NoMethodError in Users#show 

Showing /home/app_name/app/views/users/show.html.erb where line #6 raised: 

undefined method `avatar' for #<ActiveRecord::AssociationRelation::ActiveRecord_AssociationRelation_Status:0xb6859fd8> 
Extracted source (around line #6): 

<aside class="col-md-4"> 
    <section> 
    <h1> 
     <%= image_tag @user.avatar.url(:thumb) %> 
    <%= @user.name %> 
    </h1> 
    </section> 

的用戶肯定有一個化身,而據我可以計算出它似乎有麻煩通過多項式制定協會關係。它在用戶#顯示頁面上,所以大概我不應該將「用戶」更改爲「可定位」,我已經試過了,但不明白問題來自哪裏。該配置文件顯示當前狀態的訂閱源和每個用戶的化身。

任何幫助將不勝感激。

編輯

這裏是我的用戶和狀態模型:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook, :twitter, :google_oauth2] 

    before_save { self.username = username.downcase } 

    validates :first_name, presence: true, 
           length: { maximum: 25 } 
    validates :last_name,  presence: true, 
           length: { maximum: 25 } 
    VALID_USERNAME_REGEX = /\A[\w+\-._]+\z/i 
    validates :username,  presence: true, 
           length: { maximum: 20 }, 
           format: { with: VALID_USERNAME_REGEX }, 
           uniqueness: { case_sensitive: false } 
    validates :email,    presence: true 
    validates :password,  presence: true 
    validates :birthday,  presence: true 
    validates :gender,   presence: true 
    validates :postcode,   presence: true 
    validates_format_of :postcode, :with => /\A([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s?[0-9][ABD-HJLNP-UW-Z]{2}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\)?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))\z/i, :message => "invalid postcode" 

    has_attached_file :avatar, :styles => { :medium => "300x300", :thumb => "100x100", :micro => "30x30", :large => "500x500>" }, :default_url => "/images/:style/missing.jpg" 
    validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/ 

    geocoded_by :address 
    after_validation :geocode 

    self.per_page = 20 

    def address 
     [town, postcode, country].compact.join(', ') 
    end 

    def feed 
     Status.from_users_favourited_by(self) 
    end 

    def self.all_except(user) 
     where.not(id: user) 
    end 
    end 


    def name 
     first_name + " " + last_name 
    end 

    has_many :statuses, as: :statusable, dependent: :destroy 
    accepts_nested_attributes_for :statuses 

end 

class Status < ActiveRecord::Base 
    before_create :set_latlong 

    belongs_to :statusable, polymorphic: true 

    default_scope -> { order('created_at DESC') } 
    validates :content, presence: true, length: { maximum: 140 } 
    validates :statusable_id, presence: true 
    validates :statusable_type, presence: true 

    def set_latlong 
     self.latitude = statusable.latitude 
     self.longitude = statusable.longitude 
    end 

    def self.from_users_favourited_by(user) 
     favourited_user_ids = "SELECT favourite_id FROM favouriteusers 
            WHERE favourited_id = :user_id" 
     where("statusable_id IN (#{favourited_user_ids}) OR statusable_id = :user_id", user_id: user.id) 
    end 
end 

下面是狀態控制器:

class StatusController < ApplicationController 
    before_action :authenticate_user!, only: [:create, :destroy] 
    before_filter :load_statusable 

    def new 
    @status = Status.new(status_params) 
    end 


    def create 
    @statusable = load_statusable 
    @status = @statusable.statuses.build(status_params) 
    if @status.save 
     flash[:success] = "Status created!" 
     redirect_to root_url 
    else 
     @feed_items = [] 
     render 'static_pages/home' 
    end 
    end 

    def destroy 
    @status.destroy 
    redirect_to root_url 
    end 

    private 

    def status_params 
     params.require(:status).permit(:content) 
    end 

    def load_statusable 
     resource, id = request.path.split('/')[1, 2] 
     resource_name = resource.singularize.classify 
     if resource_name = "user" 
     @statusable = current_user 
     else 
     @statusable = resource_name.constantize.find(id) 
     end 
    end 
end 

最後狀態模式:

create_table "statuses", force: true do |t| 
    t.string "content" 
    t.integer "statusable_id" 
    t.string "statusable_type" 
    t.float "latitude" 
    t.float "longitude" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

我已經採取了一些措施,使其更容易閱讀,但希望留在需要的位。

編輯

class UsersController < ApplicationController 

before_filter :authenticate_user!, only: [:index, :show,:edit, 
:update, :destroy, :favourite_users, :favourited_users] 

def index 

@users = User.all_except(current_user).paginate(page: params[:page]).order('created_at DESC') 

end 


def show 

    @user = User.find(params[:id]) 

    @user = @user.statuses.paginate(page: params[:page]) 

end 


def new 

@user = User.new 

end 


def edit 

    @user = User.find(params[:id]) 

end 


def update 

    @user = User.find(params[:id]) 

    if @user.update_attributes(user_params) 

    # Handle a successful update. 

    else 

    render 'edit' 

  end 

end 


def create 

@user = User.create(user_params) 

end 


def favourite_users 

@title = "Favourites" 

@user = User.find(params[:id]) 

@users = @user.favourite_users.paginate(page: params[:page]) 

render 'show_favourite' 

end 


def favourited_users 

@title = "Listed as a Favourite by" 

@user = User.find(params[:id]) 

@users = @user.favourited_users.paginate(page: params[:page]) 

render 'show_favourite' 

end 
+0

你可以發佈你的模型? – Threeve

回答

0

那麼,它肯定看起來像@user不包含User而是ActiveRecord::AssociationRelation::ActiveRecord_AssociationRelation_Status。難怪它沒有avatar方法!檢查你的控制器代碼,看看@user實際上設置爲什麼。如果您無法理解發生了什麼,請在此處發佈控制器。可能還需要User模型和模式。

+0

謝謝,我看了一下,但還是很迷茫。我現在已經添加了模型,控制器和模式以查看是否有其他人可以解決它! –

+0

謝謝。對不起應該要求你包含'users_controller',因爲這是導致錯誤的視圖。 – Gene

+0

我現在已經添加了用戶控制器。我猜測這個問題可能來自Show方法中的will_paginate行? –