【问题标题】:Rails How To Write "Create" Action in HABTM Model ControllerRails 如何在 HABTM 模型控制器中编写“创建”操作
【发布时间】:2013-04-11 23:22:54
【问题描述】:

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

这些是我的模型:

挑战.rb:

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

技能.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#create

def create

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

    ???

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    def approved_params
      params.require(:challenge).permit(
        :name,
        :description,
        ...
        :skills => []
      )
    end
    

    然后在您的创建/更新中:

    def update
      @controller.update(approved_params)
    end
    

    就是这样

    【讨论】:

      【解决方案2】:

      我的建议是远离 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

      【讨论】:

      • 感谢您的帮助,但我的问题仍然没有解决。
      • 我建议您尝试 has_many :through ,如果它不起作用,则将错误和您的代码作为另一个问题发布。坚持下去,rails 有一百万件小事要知道,但如果你坚持下去并继续在 SO 上发帖,它就可以工作。
      • 好的。我会试试看。在我的创建操作中编写关联的最佳方式是什么?你能给我举个例子吗?谢谢
      • 您需要查看文档并尝试一下。在guides.rubyonrails...中,您会看到医生和患者以及预约,所以对您来说,这将是挑战、技能和挑战技能。在 railscast 中,您会看到类别、产品和分类,对您来说,又是 Challenge、Skill 和 ChallengeSkill。请先尝试一下,如果卡住了,请发布一个新问题(我不会检查这个)。
      • 重构我的代码后,我意识到问题出在我的参数哈希中。我不知道将 "skills"=>["", "3", "4"] 转换为 {{"id" => 3, "name" => "Senso Critico" }} 的最佳方法是什么关联类型与一些存根代码都可以正常工作。我将尝试找到哈希问题的解决方案。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多