2016-05-31 3 views
0

Ich benutze Devise als mein Authentifizierungssystem und einfache Form. Ich erhalte einen NoMethodError in Groups # show und einen undefined method 'name' for nil:NilClass Fehler. Ich verwende Modellassoziationen, um die Gruppen und Beiträge zu verknüpfen. Wenn ich puts post.user.name mache, zeigt es richtig in meinem Terminal an, aber diese Linie verursacht den oben genannten Fehler und es referenziert Groups # Show aus irgendeinem Grund. Irgendwelche Gedanken?Rails-Simple Form und Devise current_user Problem bei der Verwendung von Modellassoziationen

Routen

resources :groups do 
    resources :posts 
end 

Gruppenmodell

class Group < ActiveRecord::Base 
    validates :user_id, presence: true 

    belongs_to :user 
    has_many :posts 
    has_many :comments 
    has_many :attachments 
end 

Beitrag Modell

class Post < ActiveRecord::Base 
    validates :user_id, presence: true 
    validates :caption, presence: true 

    belongs_to :user 
    belongs_to :group 

    has_many :comments, dependent: :destroy 
end 

Group Controller

class GroupsController < ApplicationController 
before_action :authenticate_user! 

def new 
    @group = current_user.groups.build 
end 

def create 
    @group = current_user.groups.build(group_params) 
    @group.user_id = current_user.id 
    if @group.save 
     redirect_to groups_path 
    else 
     render :new 
    end 
end 

... 
private 

def group_params 
    params.require(:group).permit(:group_name, :description, :user_id) 
end 

end 

Beiträge Controllers

class PostsController < ApplicationController 

    before_action :set_post, only: [:show, :edit, :update, :destroy] 
    before_action :owned_post, only: [:edit, :update, :destroy] 
    before_action :authenticate_user! 

def index 
    @posts = Post.paginate(page: params[:page], per_page: 3).order('created_at DESC') 
    @post = current_user.posts.build 
    @attachments = Attachment.all 
end 

... 

def new 
    @post = current_user.posts.build 
end 

def create 
    @post = current_user.posts.build(post_params) 
    @group = Group.find(params[:group_id]) 
    @post.group_id = @group.id 

    if @post.save 
     redirect_to groups_path 
    else 
     render :new 
    end 
end 
... 
private 

def post_params 
    params.require(:post).permit(:caption, :user_id) 
end 

def set_post 
    @post = Post.find(params[:id]) 
end 

def owned_post 
    unless current_user == @post.user 
    redirect_to root_path 
end 

end 

end 

Gruppen/show.html.erb

<%= render "posts/index" %> 
... 

Beiträge/_index.html.erb

<%= render 'posts/form' %> 
<%= render 'posts/posts' %> 
... 

Beiträge/_form.html.erb

<%= simple_form_for([@group, @group.posts.build]) do |f| %> 
... 

Beiträge/_posts.html.erb

<% @group.posts.each do |post| %> 
<%= puts post.user.name %> ISSUE 
<%#<%= render 'posts/post', post: post %> 
<% end %> 
+0

Es scheint in einigen Posts gibt es keinen Benutzer mit diesem verbunden – Thorin

+0

Ich habe <% = puts post.user_id%> als Test, so wenn es user_id gibt es die richtige user_id im Terminal aus, aber wenn ich user_name tun tut es nicht richtig arbeiten. Könnte das ein Problem sein, wenn ich '@post = current_user.posts.build (post_params)' in meiner Post create-Methode mache und Gruppen und Beiträge nicht richtig verkette? – user3318660

+0

Haben Sie den Benutzer manuell gelöscht? und versuchen Sie es einfach mit diesem post.try (: user) .try (: name) – Thorin

Antwort

0

LÖSUNG: Nach der Nachfrage auf Reddit Rails bot ein großzügiger Benutzer eine Lösung, die funktioniert. Scheinbar erstellt der <%= simple_form_for([@group, @group.posts.build]) do |f| %> einen neuen Post und fügt ihn dem groups.posts-Array hinzu, und dies verursacht Probleme, wenn er über _posts.html.erb iteriert und es keinen Benutzer gibt. Weitere Informationen finden Sie hier: https://www.reddit.com/r/rails/comments/4lygix/unidentified_method_for_nil_class_devise_and/

Aber ersetzen Sie die oben genannte simple_form Codezeile mit <%= simple_form_for([@group, Post.new(group: @group)]) do |f| %> schien den Trick zu tun, wie von dem großzügigen Benutzer in der reddit Link oben vorgeschlagen.

Verwandte Themen