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 %>
Ah ok, mio errore. Grazie! – spl