3

したがって、結合モデルに追加情報を保存する多対多の関係で Rails フォームをセットアップする方法についてアドバイスが必要です。

背景: User と Skill の 2 つのモデルがあります。ユーザーは多くのスキルを持つことができます。スキルは多くのユーザーにマッピングできます。これを保存する結合モデル SkillAssessment があり、user_id、skill_id が保存されます。ユーザーがスキル、またはスキルレベルでどれだけ優れているかを結合モデルに保存できるようにしたいと考えています。これは、0 ~ 5 の整数値を取ることができます。

Skills テーブルにはエントリが事前に入力されているため、新しいユーザーを作成するときは、「Skills」入力を一連のチェックボックスにしたいと考えています。チェックボックスの横にフィールドを追加して、ユーザーが自分のスキルの程度を入力できるようにする方法がわかりません。これは理想的にはドロップダウンですが、それほど重要ではありません。

これがどのように見えるかの図です: チェックボックスは左側にあり、その後にラベルが続き、その後にスキルレベルを評価する追加のフィールド (テキスト入力、ドロップダウンなど) が続きます。

何をすべきかのデモンストレーション

データが保存されると、これらのモデルはうまく機能しますが、フォームを変更する方法がわかりません。スキルを節約するだけの場合は、次のようになります。

 = f.input :skills, :label => _("Skills"), :as => :check_boxes, :collection => Skill.all

ここで目的を達成するにはどうすればよいですか? 私はおそらくsemantic_fields_forか何かだと思いましたか?

参考までに、私はスリムとフォームタスティックを使用していますが、ハムルとプレーンレールを知っているので、どのような形式でもアドバイスをいただければ幸いです! みんなありがとう

4

1 に答える 1

0

データベースに入るとすべてがうまく機能するとおっしゃっていたので、モデルを:has_many, :throughではなくとして設定したと仮定していますhas_and_belongs_to_many。そうでない場合は、追加の属性を結合モデルに保存するためにそれを行う必要があります。

User モデルの SkillsAssessments に対して、accepts_nested_attributes_for をまだオンにしていない場合は、オンにする必要があります。

を使用している場合は、アクセス可能な属性のユーザー リストにattr_accessibleも追加する必要があります。skill_assessments_attributes

最終結果として、ユーザー モデルは次のようになります。

models/user.rb
===============
class User < ActiveRecord::Base

has_many :skill_assessments
has_many :skills, :through => :skill_assessments

accepts_nested_attributes_for :skill_assessments

attr_accessible :user_field, ..., :skill_assessments_attributes

繰り返しになりますが、attr_accessible を使用する場合は、skill_assessment モデルの 3 つのフィールドすべてにアクセスできるようにする必要があります。

models/skill_assessment.rb
===========================
class SkillAssessment < ActiveRecord::Base

belongs_to :user
belongs_to :skill

attr_accessible :user_id, :skill_id, :skill_level

次に、ビューでは、次のようなものになります (haml):

views/users/_form.html.haml
============================
= semantic_form_for @user do |f| 
  = f.input :user_field_1
  ...
  = f.input :user_field_n
  = f.semantic_fields_for :skill_assessments do |sa|
    = sa.input :skill_id, :label => "Skill", :collection => Skill.all
    = sa.input :skill_level, :label => "Proficiency", :collection => [1,2,3,4,5]
  = f.submit
于 2012-09-15T08:15:00.563 に答える