2013-04-23 6 views
5

Sto lavorando alla creazione di un'applicazione (dopo Michael Hartl's chapter 11) in cui gli utenti possono seguire i progetti creati da altri utenti.Rails - NoMethodError metodo non definito

Ho creato un modello ProjectRelationship per contenere due componenti: follower_id per gli utenti e projectuser_id per i progetti. Le chiavi esterne sono state configurate come tali.

In questo momento, la mia pagina _follow_form.html.erb esegue il rendering "follow" o "unfollow" a seconda che il current_user segua il progetto. Ho allegato il mio codice qui sotto.

In questo momento, il pulsante Segui viene generato su ogni pagina di presentazione del progetto. Dopo aver fatto clic sul pulsante seguito generato da _follow.html.erb, segue di conseguenza il progetto.

Ma quando premo "unfollow" ottengo un errore:

NoMethodError in ProjectRelationshipsController#destroy 
undefined method `unfollow_project!' for #<User:0x007f9ed83dd6b8> 

Application Trace | Framework Trace | Full Trace 
app/controllers/project_relationships_controller.rb:12:in `destroy' 

schema.rb

create_table "project_relationships", :force => true do |t| 
    t.integer "follower_id" 
    t.datetime "created_at",  :null => false 
    t.datetime "updated_at",  :null => false 
    t.integer "projectuser_id" 
end 

add_index "project_relationships", ["projectuser_id"], :name => "index_project_relationships_on_projectuser_id" 

routes.rb

resources :projects do  
    resources :comments 
    member do 
    get :following 
    end 
end 
resources :project_relationships, only: [:create, :destroy] 

project_relationship.rb

class ProjectRelationship < ActiveRecord::Base 
    attr_accessible :projectuser_id 

    belongs_to :user, foreign_key: "follower_id" 
    belongs_to :project, foreign_key: "projectuser_id" 
end 

project.rb

has_many :project_relationships, foreign_key: "projectuser_id" 
has_many :favorited_by, through: :project_relationships, source: :user 

user.rb

has_many :project_relationships, foreign_key: "follower_id" 
has_many :followed_projects, through: :project_relationships, source: :project 

def following_project?(project) 
    project_relationships.find_by_projectuser_id(project.id) 
end 

def follow_project!(project) 
    project_relationships.create!(projectuser_id: project.id) 
end 

def project_unfollow!(project) 
    project_relationships.find_by_projectuser_id(project.id).destroy 
end 

project_relationships_controller.rb

class ProjectRelationshipsController < ApplicationController 

def create 
    @project = Project.find(params[:project_relationship][:projectuser_id]) 
    current_user.follow_project!(@project) 
    redirect_to @project 
    end 

    def destroy 
    @project = ProjectRelationship.find(params[:id]).project 
    current_user.unfollow_project!(@project) 
    redirect_to @project 
    end 
end 

progetti/show.html.erb

<%= render 'follow_form' if signed_in? %> 

progetti/_follow_form.html.erb

<% if current_user.following_project?(@project) %> 
    <%= render 'unfollow' %> 
<% else %> 
    <%= render 'follow' %> 
<% end %> 

progetti/_follow.html.erb

<%= form_for(current_user.project_relationships.build(projectuser_id: @project.id)) do |f| %> 
    <div><%= f.hidden_field :projectuser_id %></div> 
    <%= f.submit "Follow", class: "btn btn-large btn-primary" %> 
<% end %> 

progetti/_unfollow.html.erb

<%= form_for(current_user.project_relationships.find_by_projectuser_id(@project), 
     html: { method: :delete }) do |f| %> 
    <%= f.submit "Unfollow", class: "btn btn-large" %> 
<% end %> 

progetti/_followerstats.html.erb

<%= @project.favorited_by.count %> 

risposta

3

è stato definito un metodo project_unfollow! in user.rb ma si chiama current_user.unfollow_project! in project_relationships_controller.rb

+0

Ah ok, mio ​​errore. Grazie! – spl

1

Si chiama unfollow_project! in ProjectRelationshipsController#destroy, ma il metodo che si desidera chiamare è project_unfollow! come definito nel user.rb.

1

Sostituire unfollow_project! con project_unfollow! come dichiarato nel file del modello.