Schienen - NoMethodError undefined method
Ich arbeite am Aufbau einer Anwendung (folgende Michael Hartl Kapitel 11), wo Nutzer können Sie Projekte, die von anderen Benutzern erstellt wurden.
Erstellte ich eine ProjectRelationship Modell hat zwei Komponenten: follower_id für die Benutzer und projectuser_id für die Projekte. Die foreign keys wurden als solche.
Recht jetzt mein _follow_form.html.erb
Seite macht "Folgen" oder "unfollow", je nachdem, ob die current_user
ist nach dem Projekt. Ich angehängt habe meinen code unten.
Jetzt den Folgen-button erzeugt auf jeder Projekt-Seite anzeigen. Nachdem ich klicken Sie auf die Schaltfläche Folgen, die generiert wird, durch _follow.html.erb
es folgt das Projekt dementsprechend.
Aber wenn ich drücken Sie auf "unfollow" bekomme ich eine Fehlermeldung:
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"
Routen.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
Projekt.rb
has_many :project_relationships, foreign_key: "projectuser_id"
has_many :favorited_by, through: :project_relationships, source: :user
Benutzer.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
projects/show.html-Code.erb
<%= render 'follow_form' if signed_in? %>
Projekte/_follow_form.html-Code.erb
<% if current_user.following_project?(@project) %>
<%= render 'unfollow' %>
<% else %>
<%= render 'follow' %>
<% end %>
Projekte/_gehen.html-Code.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 %>
Projekte/_unfollow.html-Code.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 %>
Projekte/_followerstats.html-Code.erb
<%= @project.favorited_by.count %>
InformationsquelleAutor spl | 2013-04-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
haben Sie eine Methode definiert
project_unfollow!
imuser.rb
aber Sie rufencurrent_user.unfollow_project!
improject_relationships_controller.rb
InformationsquelleAutor Ian Kenney
Rufen Sie
unfollow_project!
imProjectRelationshipsController#destroy
, aber die Methode, die Sie aufrufen möchten, istproject_unfollow!
wie definiert in Ihremuser.rb
.InformationsquelleAutor tessi
Ersetzen Sie Ihre
unfollow_project!
mitproject_unfollow!
wie erklärt, in Ihrem Modell-Datei.InformationsquelleAutor MichaelScaria