2017-01-10 10 views
4

作成したオブジェクトのリストを作成するWebアプリケーションのユーザーができるようにしようとしています。Ruby on Railsでリストやオブジェクトの配列を作成する

例えば、ユーザーは、食料品のようなオブジェクトのリストを持っています。これは、リンゴからオレンジ、ポップタルトまでのものです。

私は、ユーザーがデータベースに追加した食料品をすべて返却し、食料品リストに登録されている食料品を選択してリストを作成することができます。

これは、希望のチェックボックスをクリックして[保存]をクリックして新しいリストを作成できるようなスタイルにすることをお勧めします。

私はbelongs_to、has_many関係を調べて、多くの食料雑貨品を持つリストオブジェクトを作成しようとしましたが、この戦略のフォーム部分を理解できません。私はどんな/すべてのアドバイスに感謝します。ありがとう!ここで

は私が正しい道の上だとは思わないので、私は現在、私はもともとそれを省略しているコードがあるが、ここでは念のために/より多くのコンテキストを提供し、とにかくです:

食料品モデル:

class Item < ApplicationRecord 
    belongs_to :list, optional: true 
end 

一覧モデル

class List < ApplicationRecord 
    has_many :items 
end 

リストコントローラ

フォームについて何をすべきか

わからない - 私は食料品やリストとの間の関連性を保つ第3のモデルを実装することで、これを解決するだろうhttp://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

+0

あなたのコードは現在どのように見えますか? – raidfive

+0

あなたの質問にいくつかのコードを追加してください。正確に何を試しましたか –

+0

確信しているコード – Kevin

答えて

2

の線に沿って何かをしようとしていました。そして、あなたは:accepts_nested_attributes_forを使ってフォームでそれを扱うことができます。例を与えることを

が、ここで私はモデルを構築する方法を次のとおりです。

class List < ApplicationRecord 
    has_many :list_items, inverse_of: :list 
    has_many :items,  through: :list_items 

    # This allows ListItems to be created at the same time as the List, 
    # but will only create it if the :item_id attribute is present 
    accepts_nested_attributes_for :list_items, reject_if: proc { |attr| attr[:item_id].blank? } 
end 

class Item < ApplicationRecord 
    has_many :list_items 
    has_many :lists,  through: :list_items 
end 

class ListItem < ApplicationRecord 
    belongs_to :list, inverse_of: :list_items 
    belongs_to :item 
end 

そのモデル構造のある場所で、ここに新しいリストを作成するための図の一例です。

<h1>New List</h1> 
<%= form_for @list do |f| %> 
    <% @items.each_with_index do |item, i| %> 
    <%= f.fields_for :list_items, ListItem.new, child_index: i do |list_item_form| %> 
     <p> 
     <%= list_item_form.check_box :item_id, {}, item.id, "" %> <%= item.name %> 
     </p> 
    <% end %> 
    <% end %> 
    <p> 
    <%= f.submit 'Create List' %> 
    </p> 
<% end %> 

ここで何が起こっているのかを説明するために、@itemsがリストに追加することができ、すべてのアイテムを持っているためにプリロード変数です。私は各Itemをループし、手作業でFormBuilderメソッドfields_forに渡します。

手動で行うので、:child_indexを同時に指定する必要があります。そうしないと、それぞれのチェックボックスに前の項目と同じ名前属性(つまりname="list[list_item_attributes][0][item_id]")が追加され、サーバ。

そして、次のように宣言していcheck_box FormBuilder方法:

def check_box(method, options = {}, checked_value = "1", unchecked_value = "0") 

チェックボックスをオンにしたとき、それはitem.idから値を持っており、それならばそのようしたがって、上記の形で、私はそれらのデフォルト値を置き換えますチェックされていない場合、値は空白です。これをリストモデルのという宣言と組み合わせてください。ここでは:item_idが空白の場合に拒否する必要があり、チェックされた項目に対してのみListItemを作成した結果が得られます。

この作品を作るための最後のものは、このように、コントローラ内でネストされた属性を可能にすることである。

def allowed_params 
    params.require(:list).permit(list_items_attributes: [:item_id]) 
end 
+0

私のしたことを見てください。 – Kevin

+0

これはうまくいくように見えます:)私が展示したアプローチは少し複雑かもしれませんが、追加したいアイテムの数と回数を追加する場合にはもっと適していますアイテムを別のリストに追加しましたが、それを望まない場合は、あなたのアプローチは問題ありません。最後の注意として、no:list_idが割り当てられた問題を解決するもう1つの方法は、Listのアソシエーション、すなわち '@item = @ list.items.create(allowed_pa​​rams)'からItemを作成することです。それはデフォルトでlist_idを割り当てます – DanneManne

0

だから私は、次の質問を発見し、どのような私を達成することができるようにするためにそれを使用しました欲しかった

Display a checkbox list instead of multiple select

私は単に私が割り当てられLIST_IDがなかったというエラーを持っていた時点で、次の

<% form_for @list do |f| %> 
    <% Item.all.each do |item| 
    <%= f.check_box(:items, { :multiple => true }, item.id) %> 
    <% end %> 
<% end %> 

を実施しました。 Itemモデルにattirbute "list_id"を追加するためにマイグレーションを行いました。

問題がありますか?

関連する問題