2015-01-24 2 views
1

Я боролся с 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 
+0

Показать валидации вы пробовали. – Nobita

+0

Не уверен, что это сработает, но попробуйте изменить 'has_many: post_authors' на' has_many: post_authors', inverse_of:: author' –

+0

Я пробовал inverse_of, но, к сожалению, это не имело значения. – Thomas

ответ

0

Согласно rails guide валидаций только срабатывает, когда следующие методы называются:

  • создать
  • создать!
  • save
  • save!
  • обновление
  • обновление!

Так что я считаю, что ваш лучший шанс был бы спасти ActiveRecord::RecordNotFound в контроллере, как это объясняется в этом вопросе:

how to handle ActiveRecord::RecordNotFound in rails controller?

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