2016-05-31 5 views
0

Я использую Devise в качестве моей системы аутентификации и простой формы. Я получаю сообщение NoMethodError в группах # show и undefined method 'name' for nil:NilClass. Я использую ассоциации моделей, чтобы связать группы и сообщения вместе. Когда я делаю puts post.user.name, он правильно отображается в моем терминале, но эта строка вызывает указанную выше ошибку и по какой-либо причине ссылается на группы # show. Есть предположения?Rails-Simple Form и Devise current_user при использовании ассоциаций моделей

Маршруты

resources :groups do 
    resources :posts 
end 

Group Модель

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

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

Сообщение Модель

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 

Группа Контроллер

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 

Сообщений Контроллер

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 

группы/show.html.erb

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

сообщений/_index.html.erb

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

сообщений/_form.html.erb

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

Должности/_posts.html.erb

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

В некоторых сообщениях нет пользователей, связанных с этим – Thorin

+0

У меня есть <% = puts post.user_id%> как тест, поэтому, когда он user_id, он выводит правильный user_id в терминал, но когда я делаю user_name, он делает не работает должным образом. Может ли это быть проблемой, когда я делаю '@post = current_user.posts.build (post_params)' в методе создания сообщений и не правильно группирую группы и сообщения? – user3318660

+0

Вы удаляете пользователя вручную? и просто попробуйте этот пост.try (: user) .try (: name) – Thorin

ответ

0

РЕШЕНИЕ: После запроса Reddit Rails щедрый пользователь предложил решение, которое работает. По-видимому, <%= simple_form_for([@group, @group.posts.build]) do |f| %> создает новое сообщение и добавляет его в массив groups.posts, поэтому это вызывает проблемы, когда он выполняет итерацию через _posts.html.erb, и нет пользователя. Более подробную информацию можно найти здесь: https://www.reddit.com/r/rails/comments/4lygix/unidentified_method_for_nil_class_devise_and/

Но заменить указанную выше строку кода simple_form на <%= simple_form_for([@group, Post.new(group: @group)]) do |f| %>, как представляется, предложили щедрый пользователь в ссылке reddit выше.

Смежные вопросы