1

私はこれを数日間処理しようとしていますが、何も機能しません。私は、Michael Hartl のすばらしいチュートリアル ( http://ruby.railstutorial.org/ ) に基づいて、最初のアプリを作成しています。さらに、このチュートリアルを試してみましたが、私のコードと彼のコードの違いが大きすぎて従うことができませんでした。

私のアプリが Michael Hurtl のアプリと異なるところは、残りのペンキの缶を投稿できるサイトを作成しようとしているということです (マイクロポスト、AKA twitter の代わりに)。アプリを作成したとき、Paints モデルに「color_family」という列がありました。今、私はそれをテキストフィールドから、「赤」、「オレンジ」、「黄」、「緑」などの所定の値を持つドロップダウンに変更しようとしています.

新しい足場を生成することから始めました。

rails generate scaffold Color_Family family:string

次に、移行を生成しました。

rails generate migration AddColor_FamilyToPaints family_id:int

すべて移行しました。

次に、関連付けを作成しました

class ColorFamily < ActiveRecord::Base
    has_many :paints
end

class Paint < ActiveRecord::Base
    attr_accessible :family_id, :name, :hex, :location, :quantity, :additional_info
    belongs_to :user
    belongs_to :color_family
    ...
end

これは私が迷子になる場所であり、私が従おうとするチュートリアルはすべてを壊します. color_families の事前定義リストはどこで定義できますか?

新しいモデルを作成する価値はありますか? 以前にフォームフィールドでこれを試しました:

<%= form_for(@paint) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
    <%= f.label :color_family %>
    <%= select_tag(:color_family, options_for_select([['Red', 1],
                                                        ['Orange', 2], 
                                                        ['Yellow', 3], 
                                                        ['Green', 4], 
                                                        ['Blue', 5], 
                                                        ['Purple', 6], 
                                                        ['Black', 7], 
                                                        ['Grey', 8], 
                                                        ['White', 9], 
                                                        ['Cream', 10],
                                                        ['Brown', 12]])) %> 

ドロップダウンを作成しましたが、新しいペイントを追加したときに情報を取得することはありませんでした。

どんな助けでも大歓迎です。また、チュートリアルへのリンクは、私が RoR やバックエンド全般に非常に慣れていないため、おそらく最大の助けになるでしょう。

4

1 に答える 1

2

本の朗読版をやっているのか、ビデオをやっているのかはわかりません。個人的にはどっちもオススメ!絶対に素晴らしいチュートリアルです!ただし、彼が最初に言及したことの 1 つは、「Scaffold は実際には現実世界向けではない」ということであり、これを考慮する必要があります。プロジェクト、新旧、または単にリファクタリングを行っているとき、私は通常、スクリプト/生成を使用してすべてを手動で追加します。私がこれまでに使用した唯一の「足場」は scaffold_controller でした。コントローラーを手動で作成するのが面倒だったからです。

簡単に言えば、別のモデル「色」が必要であり、フォームは次のようにする必要があります。

f.collection_select(:color_id, Color.find(:all), :id, :name, {:include_blank => 'Please Select A Color'})

そして ColorFamily はおそらく has_many_and_belongs_to_many Colors になるはずです

行われていると思われる関連付けの詳細を教えていただければ、小さなデータ モーダルを作成できます。


編集#1

has_one :through 関係が必要です。一般的なコンセプトは...

ピボット テーブル:

rails g migration ColorFamilyPaints paint_id:integer color_family_id:integer

塗装クラス:

class Paint < ActiveRecord::Base
    attr_accessible :family_id, :name, :hex, :location, :quantity, :additional_info,
                    :color_families_attributes # Need to add this in order for you to be able to post with drop down
    belongs_to :user
    ...
    # Creates the Relationship
    has_one :color_families, :through => :color_family_paints

    # Allows color families to be nested in the form.
    accepts_nested_attributes_for :color_families, :allow_destroy => true
end

いくつかの変更に気付くでしょう。attr_accessible、およびaccepts_nested_attributes_forへの追加(これが必要になる場合がありますが、has_oneではわかりません)。フォームを作成するときは、選択ボックスの ID/名前を確認してください。_attributes で終わる場合は、accepts 行を使用します。そうでない場合は、必要ありません。:color_families_attributes を選択ボックスの名前と一致するように変更します。

フォーム HTML:

<%= form_for(@paint) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
    <div class="field">
        <%= f.label :color_family %>
        <%= f.collection_select(:color_family, ColorFamily.find(:all), :id, :name, {:include_blank => 'Please Select Color Family'}) %>
    </div>
<% end %>

協会の詳細については、RoR の Web サイトをご覧ください。

于 2012-07-16T21:37:46.553 に答える