2015-09-19 4 views
0

Я получаю сообщение «Не удалось найти местоположение с ID = 4 для сообщения с ошибкой ID =» в PostsController # create, когда пользователь создает новое сообщение с вложенной формой местоположения ,Rails 4.2 поднял ActiveRecord :: RecordNotFound при создании нового сообщения

В этом случае сообщение имеет одно местоположение, и у пользователя есть много мест через сообщения.

Пользователи могут создать первое новое сообщение успешно, но ошибка возникает, когда пользователи снова создают новое сообщение.

PostsController:

class Categories::PostsController < ApplicationController 
... 
def new 
    @post = Post.new 
    if current_user.locations 
     @post.location = current_user.locations.first 
    else 
     @post.build_location 
    end 
    end 

    def create 
    @post = current_user.posts.build(post_params)    
    @post.category = @category    

    if @post.save    
     flash[:success] = "You have succesfully created a new post."    
     redirect_to [@category, @post]     
    else     
     flash[:danger] = "Error occured. Please try again."    
     render :new    
    end    
    end 

... 

    private 
    def post_params 
     params.require(:post).permit(:title, :body, location_attributes: [:id, :street, :city, :zipcode, :_destroy]) 
    end 
end 

Здесь @post = current_user.posts.build(post_params) в создании действия бросает ошибку.

Я заметил, что когда я удалил location_attributes: [:id], пользователи могут создавать новые сообщения. Но без белого идентификатора местоположения в журнале сервера есть ошибка «Неверный параметр id», а также пользователи не могут удалить вложенную форму местоположения при редактировании сообщений.

Я понимаю, что метод создания будет работать путем удаления:

if current_user.locations 
    @post.location = current_user.locations.first 

Однако моя цель состоит в том, чтобы получить предыдущие данные о местоположении от пользователей, так что они не должны проставить тот же адрес снова в новом сообщения.

Кроме того, я хотел бы, чтобы почта была создана без заполнения формы местоположения.

Благодарим за помощь!

Update: Я попытался изменить ассоциацию для пользователя, Location и Поста моделей, но это не исправить ту же ошибку я получил.

post.rb

belongs_to :location 
belongs_to :user 
accepts_nested_attributes_for :location 

location.rb

has_many :posts 
belongs_to :user 

user.rb

has_many :posts 
has_many :locations 

Какие другие методы могут помочь исправить ошибку?

ответ

2

Это положение, когда ваше сообщение должно быть belong_to a Место, а не have_one. Это поместит внешний ключ location_id в таблицу сообщений, которая должна быть на модели, которую вы собираетесь, т. Е. through: posts.

В настоящее время, когда вы вызываете @post.save в свой контроллер, он попытается запросить db для сообщения, которое еще не было сохранено в базе данных, что дало вам эту ошибку.

post.rb

belongs_to :location 
belongs_to :user 
accepts_nested_attributes_for :location 

местоположение.Р.Б.

has_one :post 

user.rb

has_many :posts 
has_many :locations, through: :posts 

Наконец, вам необходимо добавить ссылку на БД.

rails g migration AddLocationRefToPosts location:references 

Ваш код контроллера выглядит хорошо, насколько я могу судить и должен работать после этих изменений.

+0

JeffD23, большое спасибо за вашу помощь! Не могли бы вы также объяснить, почему «Почта» в этом случае должна принадлежать местоположению? Если почта принадлежит местоположению, предотвратит ли это сообщение от уничтожения мест, когда мы обновим атрибуты post? –

+0

Сообщение должно принадлежать к местоположению, потому что вам нужен внешний ключ в модели Post для «User has_many: местоположения, через:: posts» для правильной работы. belongs_to и has_one почти идентичны, различие заключается в том, где находится foreign_key. Обновление атрибутов сообщения не должно уничтожать местоположения, если вы специально не указали это в контроллере. – JeffD23

+0

Извините, после изменения связи между почтой и местоположением такая же ошибка сохраняется. –

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