2015-08-06 2 views
0

Мне удалось установить несколько связей HABTM без каких-либо проблем, но по какой-то причине я не могу заставить отношение belongs_to/has_many записывать значения.Rails 4 принадлежит_to/has_many отношения не работают

  1. Статья belongs_to Тип (новости, редакционная, хроника и т.д.)
  2. A Тип has_many Статья
  3. Schema.db показывает type_id целочисленного столбца, модели используют BELONGS_TO и has_many и выпадающий типов статей появляется в форме на новых страницах редактирования статьи.
  4. Но при выборе типа из раскрывающегося списка (например, «хроника») он говорит, что он создает или редактирует статью успешно, но не регистрирует связь между статьей и «хроникой». Возвращаясь к редактированию одной и той же статьи, выпадающий список показывает только верхний тип («анализ»), а не «хроника».

Так что не знаю, где я ошибаюсь. Вот все соответствующие биты, начиная с базы данных.

От 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 %>

Любые идеи?

ответ

0

Вы должны изменить article_params ниже

def article_params 
    params.require(:article).permit(:headline, :lede, :body, :type_id, :category_ids => [], :region_ids => [], :story_ids => []) 
end 

Обратите внимание на изменение :type_id => [] к :type_id

+0

Это ** GREAT **! Спасибо, Паван. Потому что «type_id» является частью таблицы статей, а не массивом из таблицы соединений? Как вы можете получить к нему доступ в представлении? Если я попробую: '<% = @ article.type%>' Он возвращает: "# <Тип: 0x007f9c249929c0>" –

+0

@MatthewBennett Его нормальная ассоциация 'own_to'. Таким образом, это должно быть так, как – Pavan

+0

@MatthewBennett Попробуйте '<% = @ article.type.name%>' – Pavan

0

Как будет только один type_id в каждой записи статьи, ваши необходимые Титулы не должны содержать массив TYPE_ID , поэтому измените его только на: type_id вместо: type_id => []

def article_params 
    params.require(:article).permit(:headline, :lede, :body, :type_id, :category_ids => [], :region_ids => [], :story_ids => []) 
end 
+0

Спасибо Энн, это был ответ! –