Ruby on Rails:多对多关系

时间:2012-05-21 13:16:12

标签: ruby-on-rails ruby

我有一个包含3个表的数据库:User,Card,Cardset:

User has_many Cards
User has_many Cardsets
Card belongs_to User
Cardset belongs_to User
Card has_and_belongs_to_many Cardsets
Cardset has_and_belongs_to_many Cards

卡片基本上是一张"闪卡",它有card.term和card.definition列。

在view card / new.html中,登录用户可以在其中创建新卡片,我创建了以下表单:

<%= form_for(@card) do |f| %>
  <%= f.label :term, "Termin" %>
  <%= f.text_field :term %>
  <%= f.label :definition, "Definicja" %>
  <%= f.text_area :definition %>
  <%= f.label :cardset, "Dodaj automatycznie do setu:" %>
  <%= select("cardset", :id, current_user.cardsets.all.collect {|p| [ p.name, p.id ] }, {:include_blank => true}) %>
  <br>
  <%= f.submit "Dodaj kartę!", class: "btn btn-large btn-primary" %>
<% end %>

有问题的一行是:

<%= select("cardset", :id, current_user.cardsets.all.collect {|p| [ p.name, p.id ] }, {:include_blank => true}) %>

我希望这是一个下拉菜单,其中包含属于创建新卡的用户的所有集合。当用户从此列表中选择一个集并单击“提交”时,将自动创建新卡与所选卡集之间的关系(表中的多对多关系:Cards_Cardsets)。

在我的card_controller中,我有:

def create
  @card = current_user.cards.build(params[:card])
  @cardset = Cardset.find_by_id(params[:cardset])
  @card.cardsets<<@cardset
  if @card.save
    flash[:success] = "Utworzono karte!"
    render 'show'
  else   
    flash.now[:error] = 'Uzupelnij pola.'
    render 'new'
  end
end

该行:

@cardset = Cardset.find_by_id(params[:cardset])

用于返回所选的卡片组。但相反,它会返回此错误:

Unknown key: id
app/controllers/cards_controller.rb:8:in 'create'

如果我将id硬编码到这一行:

@cardset = Cardset.find_by_id(3)

然后它起作用。所以我想问题是由这个表达式引起的:

params[:cardset]

我怎样才能让它发挥作用?

0 个答案:

没有答案