Я использую 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 %>
В некоторых сообщениях нет пользователей, связанных с этим – Thorin
У меня есть <% = puts post.user_id%> как тест, поэтому, когда он user_id, он выводит правильный user_id в терминал, но когда я делаю user_name, он делает не работает должным образом. Может ли это быть проблемой, когда я делаю '@post = current_user.posts.build (post_params)' в методе создания сообщений и не правильно группирую группы и сообщения? – user3318660
Вы удаляете пользователя вручную? и просто попробуйте этот пост.try (: user) .try (: name) – Thorin