Я боролся с Rails has_many: через всю неделю. Первоначально у меня были проблемы с получением collection_select form helper to save.Rails has_many: через проверку вопроса
В конечном итоге я получил это на работу и перешел к попытке получить запрос на json post для поддержки добавления нового автора. Я смоделировал json после параметров запроса, созданных с использованием теперь функционирующей формы. Он работал в самом первый раз, когда я сделал запрос с этим Params:
{
"author": {
"name": "Author Name",
"post_ids": [
"1", "2"
]
}
}
я начал испытывать мои валидаций, и столкнулся с проблемой, где если post_id посылаемой, что не существует в базе данных Rails будет бомбить на методе @ author.new:
Запрос:
{
"author": {
"name": "Author Name",
"post_ids": [
"23"
]
}
}
Ошибка:
ActiveRecord::RecordNotFound (Couldn't find Post with 'id'=23):
app/controllers/authors_controller.rb:32:in `create'
Контроллер
def create
@author = Author.new(author_params)
respond_to do |format|
if @author.save
format.html { redirect_to @author, notice: 'Author was successfully created.' }
format.json { render :show, status: :created, location: @author }
else
format.html { render :new }
format.json { render json: @author.errors, status: :unprocessable_entity }
end
end
end
Он бомбит на этой линии
@author = Author.new(author_params)
Я пытался использовать валидации, чтобы убедиться, что идентификатор существует, но это erroring прежде, чем это когда-либо делает его к проверкам. Кажется, что рельсы создают ассоциации в новом методе.
Как это уловить? Я написал чек перед вызовом Author.new, чтобы убедиться, что отправлено author_ids существует, но если рельсы предоставляют эту возможность, я бы хотел использовать встроенные функции, чтобы поймать его и отправить обратно с помощью других вместо этого.
Модели:
class Author < ActiveRecord::Base
has_many :post_authors
has_many :posts, :through => :post_authors
accepts_nested_attributes_for :post_authors
end
class Post < ActiveRecord::Base
end
class PostAuthor < ActiveRecord::Base
belongs_to :post
belongs_to :author
end
схемы
ActiveRecord::Schema.define(version: 20150120190715) do
create_table "authors", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "post_authors", force: :cascade do |t|
t.integer "post_id"
t.integer "author_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "posts", force: :cascade do |t|
t.string "title"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Спасибо за любую помощь.
Validation ПОПЫТКА
я поставил следующую проверку ниже во всех 3-х моделей. Я добавил точки останова и сообщения журнала. Ни один из них не попал до того, как произошла ошибка, поэтому на данный момент я нигде не получаю проверки, чтобы даже сделать чек.
class Author < ActiveRecord::Base
has_many :post_authors
has_many :posts, :through => :post_authors
accepts_nested_attributes_for :post_authors
validate :post_exists
def post_exists
Rails.logger.debug("Validate")
end
end
Показать валидации вы пробовали. – Nobita
Не уверен, что это сработает, но попробуйте изменить 'has_many: post_authors' на' has_many: post_authors', inverse_of:: author' –
Я пробовал inverse_of, но, к сожалению, это не имело значения. – Thomas