У меня ошибка, которая, скорее всего, вызвана ассоциациями has_one в моей модели.has_one ассоциация и исчезающий идентификатор пользователя
Выпуск
После объявления этих ассоциаций я начал иметь странные взаимодействия, где я бы внезапно получить "undefined method
электронную почту»для ноля: NilClass" `со следующим фрагментом из консоли ошибок:
<div class="row">
<div class="column-md-6 column-md-offset-3">
<% @posts.each do |post| %>
email: <%= post.user.email %> <br> # <= source of the issue!
Level: <%= post.level %> <br>
Region: <%= post.region %> <br>
Info: <%= post.description %> <br>
<% if post.user == current_user %>
<%= link_to "Edit", edit_post_path(post) %>
Источник вопроса
Мне было трудно отслеживать ошибку и пытаться ее воспроизвести. быстро просмотрите мою базу данных в консоли rails и узнайте, что user_id становится нулевым, даже несмотря на то, что создание сообщения от пользователя прошло успешно. Я, наконец, удалось воспроизвести ошибку, выполнив следующие действия:
1) Вход
2) Создание Почте
3) Заходим в "все сообщения". Действие индекса индекса делает здесь все сообщения от каждого пользователя правильно.
4) Пока все еще зарегистрирован как один и тот же пользователь, создайте другое сообщение.
5) Вернитесь на «Все сообщения», и я получаю вышеупомянутую ошибку.
сообщение модель
class Post < ActiveRecord::Base
validates_presence_of :level, :region, :description
validates :level, length: { maximum: 50 }
belongs_to :user
end
модель пользователя
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :post
end
сообщений контроллер
class PostsController < ApplicationController
before_action :set_post, only: [:edit, :update]
before_action :authenticate_user!, except: [:index, :show]
def index
@posts = Post.all
end
def show
@post = Post.find(params[:id])
end
def new
@post = current_user.build_post
end
def create
@post = current_user.build_post(post_params)
if @post.save
flash[:success] = "Post successfully created!"
redirect_to posts_path
else
render 'new'
end
end
def edit
end
def update
#@post = Post.find(post_params)
if @post.update(post_params)
flash[:success] = "Profile updated"
redirect_to posts_path
else
render 'edit'
end
end
def destroy
Post.find(params[:id]).destroy
flash[:success] = "Post deleted"
redirect_to posts_path
end
private
def post_params
params.require(:post).permit(:description, :level, :region)
end
def set_post
@post = Post.find(params[:id])
end
конец
schema.rb
ActiveRecord::Schema.define(version: 20151209193950) do
create_table "posts", force: :cascade do |t|
t.text "description"
t.string "level"
t.string "region"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
Вопрос
Моя цель состояла в том, чтобы иметь предел один пост для каждого пользователя. Я почти уверен, что ассоциация has_one является частью проблемы. Мой вопрос заключается в том, является ли это правильным способом достижения моей цели, или я должен использовать ассоциацию has_many и применять предел каким-то другим способом?
Если has_one является правильным способом, как я могу исправить эту проблему?
Можете ли вы опубликовать свою схему db. –
@PadmanabanGokula Обновлено мое оригинальное сообщение. – Lotix