Мне удалось установить несколько связей HABTM без каких-либо проблем, но по какой-то причине я не могу заставить отношение belongs_to/has_many записывать значения.Rails 4 принадлежит_to/has_many отношения не работают
- Статья belongs_to Тип (новости, редакционная, хроника и т.д.)
- A Тип has_many Статья
- Schema.db показывает type_id целочисленного столбца, модели используют BELONGS_TO и has_many и выпадающий типов статей появляется в форме на новых страницах редактирования статьи.
- Но при выборе типа из раскрывающегося списка (например, «хроника») он говорит, что он создает или редактирует статью успешно, но не регистрирует связь между статьей и «хроникой». Возвращаясь к редактированию одной и той же статьи, выпадающий список показывает только верхний тип («анализ»), а не «хроника».
Так что не знаю, где я ошибаюсь. Вот все соответствующие биты, начиная с базы данных.
От schema.db:
create_table "articles", force: :cascade do |t|
t.string "headline"
t.string "lede"
t.text "body"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "type_id"
end
create_table "types", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Тогда модели:
class Article < ActiveRecord::Base
has_and_belongs_to_many :categories
has_and_belongs_to_many :regions
has_and_belongs_to_many :stories
belongs_to :type
end
class Type < ActiveRecord::Base
has_many :articles
end
и контроллер статьи:
# GET /articles/new
def new
@article = Article.new
@regions = Region.all.order(:region)
@categories = Category.all.order(:category)
@stories = Story.all.order(:story)
@types = Type.all.order(:name)
end
# GET /articles/1/edit
def edit
@regions = Region.all.order(:region)
@categories = Category.all.order(:category)
@stories = Story.all.order(:story)
@types = Type.all.order(:name)
end
# POST /articles
# POST /articles.json
def create
@article = Article.new(article_params)
respond_to do |format|
if @article.save
format.html { redirect_to @article, notice: 'Article was successfully created.' }
format.json { render :show, status: :created, location: @article }
else
format.html { render :new }
format.json { render json: @article.errors, status: :unprocessable_entity }
end
end
end
/* …and then at the bottom… */
def article_params
params.require(:article).permit(:headline, :lede, :body, :category_ids => [], :region_ids => [], :story_ids => [], :type_id => [])
end
И, наконец, в статьях составляют:
<strong>Type:</strong> <%= f.collection_select :type_id, @types, :id, :name %>
Любые идеи?
Это ** GREAT **! Спасибо, Паван. Потому что «type_id» является частью таблицы статей, а не массивом из таблицы соединений? Как вы можете получить к нему доступ в представлении? Если я попробую: '<% = @ article.type%>' Он возвращает: "# <Тип: 0x007f9c249929c0>" –
@MatthewBennett Его нормальная ассоциация 'own_to'. Таким образом, это должно быть так, как – Pavan
@MatthewBennett Попробуйте '<% = @ article.type.name%>' – Pavan