Rails如何在HABTM模型控制器中编写“创建”动作

时间:2013-04-11 23:22:54

标签: html database ruby-on-rails-3

我对Rails相对较新,我在尝试使用它们之间具有HABTM关联的模型时遇到了巨大的困难。

这些是我的模特:

challenge.rb:

class Challenge < ActiveRecord::Base
    has_and_belongs_to_many :skills
    attr_accessible :description, :name, :relevant_content, :solutions, :skills
end

skill.rb:

class Skill < ActiveRecord::Base
    has_and_belongs_to_many :challenges

    attr_accessible :name
end

我还使用以下迁移创建了一个名为challenge_skills的连接表:

class CreateChallengesSkills < ActiveRecord::Migration
    def up
        create_table :challenges_skills, :id => false do |t|
        t.integer :challenge_id
        t.integer :skill_id
        end
    end

    def down
    drop_table :challenges_skills
    end
end

我正在使用下面的助手来选择我需要的挑战技能:

<%= collection_select(:challenge, :skills, Skill.all, :id, :name, {}, {:multiple => "true"}) %>

HTML:

<select id="challenge_skills" multiple="multiple" name="challenge[skills][]">
    <option value="2">Pesquisa</option>
    <option value="3">Senso Critico</option>
    <option value="4">Criatividade</option>
    <option value="5">Colaboracao</option>
    <option value="6">Comunicacao</option>
    <option value="7">Proatividade</option>
</select>

这是我的参数哈希:

{"utf8"=>"✓",
 "authenticity_token"=>"n0ggK8eE7vjh+qY33lYbNLJtZW6Sz7LyM2IRVbAPwhM=",
 "challenge"=>{"description"=>"My description.",
 "skills"=>["", "3", "4"],
 "name"=>"Test Challenge",
 "relevant_content"=>"My relevant_content",
 "solutions"=>"My solutions"},
 "commit"=>"Create Challenge!"
}

错误:     技能(#70228688111620)预期,得到字符串(#14953820)

问题是我不知道如何处理技能哈希,把它变成我的挑战控制器创建动作里面的对象数组。 我知道它应该是简单的但我找不到实用的解决方案。 我想知道如何编写代码以将技能集合与挑战控制器中的挑战实例相关联。

ChallengesController#创建

def create

    @challenge = Challenge.new(params[:challenge])

    ???

由于

2 个答案:

答案 0 :(得分:0)

实际答案是为您接受的参数添加“技能”:

def update
  @controller.update(approved_params)
end

然后进入你的创建/更新:

class Parent {
  val value = {
    println("Setting value in parent")
    "ParentVal"
  }
  println(s"Parent value is ${value}")
}

class Child extends Parent {
  override val value = {
    println("Setting value in child")
    "ChildVal"
  }
  println(s"Child value is ${value}")
}

new Child

就是这样

答案 1 :(得分:-5)

我的建议是远离HABTM并切换到has_many :through随着时间的推移,它将更容易使用并且更灵活地更改(添加属性)。

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

https://stackoverflow.com/a/11601236/631619

这里有两个很好的比较:

http://railscasts.com/episodes/47-two-many-to-many