Отображение «многие ко многим» с использованием выбора нескольких

прямо сейчас я создаю форму, которая принимает многие ко многим, используя множественный выбор. после создания формы я пытаюсь отобразить информацию, собранную на странице SHOW, однако я не знаю, как отобразить эти данные во встроенном ruby. модель соединения - CardTypesList

Модели

class Card < ActiveRecord::Base
self.inheritance_column = nil
validates :name, presence: true, uniqueness: {case_sensitive: false}

has_many :card_type_lists
has_many :card_types, through: :card_type_lists
    accepts_nested_attributes_for :card_type_lists
end

class CardType < ActiveRecord::Base
has_many :card_type_lists
has_many :cards, through: :card_type_lists
end

class CardTypeList < ActiveRecord::Base
belongs_to :cards
belongs_to :card_types
    accepts_nested_attributes_for :card_type
end

НОВАЯ форма с использованием выбора

<%= f.label :types %>
    <%= f.select :card_type_ids, CardTypes.all.collect{|x| [x.name, x.name]}, {},{:title => "Select a Type", :multiple => true, :class => 'selList'} %>

Встроенные рубиновые испытания

<td class="card-td"><%= @card.card_types %></td>

Ожидается: ["Тип 1", "Тип2"] это отображает страницу, но дает (в тексте):

    <ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_CardTypes:0x00000102f58a18>

РЕДАКТИРОВАТЬ: добавлена ​​схема.

ActiveRecord::Schema.define(version: 20140120042152) do

  create_table "card_type_lists", force: true do |t|
    t.integer  "card_type_id"
    t.integer  "card_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "card_types", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "cards", force: true do |t|
    t.string   "name"
    t.string   "set"
    t.string   "card_types"
    t.string   "colors"
    t.string   "cost"
    t.string   "rarity"
    t.string   "oracle"
    t.float    "value"
    t.integer  "number_owned"
    t.string   "notes"
    t.string   "img_link"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "types_mask"
  end

  add_index "cards", ["name"], name: "index_cards_on_name", unique: true

end

и это мой контроллер:

    class CardsController < ApplicationController
  def new
@card = Card.new
    @card.card_type_lists.build.build_card_type
  end

  def show
@card = Card.find(params[:id])
  end

  def create
    @card = Card.new(card_params)
    if @card.save
        redirect_to @card
    else
        render 'new'
    end
  end

  private

  def card_params
    params.require(:card).permit(:name, :set, {:card_types => []}, :color, :cost,      :rarity,:oracle,:value, :number_owned,:notes)
  end
end

person PhilVarg    schedule 20.01.2014    source источник


Ответы (1)


Должно быть:

class CardTypeList < ActiveRecord::Base
    belongs_to :card
    belongs_to :card_type #Singular
end

Еще несколько вещей, о которых стоит подумать:

  1. Есть ли в вашей модели соединения правильные столбцы?
  2. Вы должны использовать accepts_nested_attributes_for
  3. Посмотрите, как вы вызываете данные

Схема

Модели соединения в has_many :through должны иметь foreign_key ссылки на обе модели, к которым они присоединяются. Способ, которым вы это делаете, заключается в использовании такой схемы:

card_types_lists
id | card_id | card_type_id | other | information | created_at | updated_at

Когда вы упомянули об ошибке no such column: card_type_lists.card_types_id, это обычно означает, что либо у вас нет правильного столбца в базе данных, либо ваша ссылка неверна. Глядя на это, это ваша ассоциация (ссылка на множественное число вместо единственного) (исправлено выше)


Формы

Вы должны рассмотреть возможность использования accepts_nested_attributes_for для отправки правильных данных во вложенный модели

Это когда вы хотите создать некоторые записи в любой модели, и работает, позволяя вам определять «новые» объекты для других ваших моделей в вашей родительской модели, передавая данные вашим дочерним моделям, например :

#app/models/card.rb
Class Card < ActiveRecord::Base
    has_many :card_type_lists
    has_many :card_types, through: :card_type_lists

    accepts_nested_attributes_for :card_type_lists
end

#app/models/card_type_list.rb
Class CardTypeList < ActiveRecord::Base
    belongs_to :card
    belongs_to :card_type

    accepts_nested_attributes_for :card_type
end

#app/controllers/cards_controller.rb
def new
    @card = Card.new
    @card.card_types_lists.build.build_card_type
end

Данные

Если вы хотите правильно отображать свои ассоциативные данные, попробуйте следующее:

#app/views/cards/show.html.erb
<%= @card.card_types %>
person Richard Peck    schedule 20.01.2014
comment
я изменил модель соединения на сингулярную, добавил вложенные атрибуты для и добавил строку сборки, но я все еще получаю постоянную ошибку uninit. я добавил свою схему в свой OP, я думаю, что мои типы атрибутов могут быть неправильными в таблице карт - person PhilVarg; 20.01.2014
comment
так что я получил рендеринг страницы, но теперь, однако, мой первоначальный вопрос все еще висит. я пробовал ‹%= @card.card_types %›, но он просто отображает большой тег, а не фактический массив данных, которые я пытаюсь сохранить/отобразить. - person PhilVarg; 20.01.2014
comment
хорошо, так что я, наконец, получил это! (после внесения всех предложенных вами изменений) моему контроллеру нужно было изменить :card_types на :card_type_ids def card_params params.require(:card).permit(:name, :set, {:card_type_ids =› []}, :color, :cost , :rarity,:oracle,:value, :number_owned,:notes) конец затем во встроенном файле ruby ​​SHOW, который я сделал (во встроенных тегах) @card.card_types.each_index do |i| @card.card_types[i][name] end спасибо за помощь, Рик! у меня могут возникнуть некоторые проблемы позже, когда я реализую редактирование, но мы пересечем эту реку, когда доберемся туда, ха-ха - person PhilVarg; 21.01.2014