2016-04-27 36 views
1

私はRailsの世界が初めてです。もっと学習するためにいくつかのサンプルアプリケーションを試しています。私は立ち往生しており、何か助けていただければ幸いです。私は成功しないで同様の質問を探しました。しかし、私はそこに1つがあると思います。Rails - テーブルまたは選択して関連付けに追加

ケースは次のとおりです。レシピを通じた成分が多いケーキモデルがあります。作成、編集、削除はOkです。私がすでに学んだ基礎です。しかし、私は、ケーキを作成(または編集)しながら、そのレシピに既に入っているすべての成分を見ることができるようにしたい(完了)し、選択したものから選択するか、レシピから追加または削除する。このすべてをデータベースにコミットせずに、ページをリロードしないでください(Ajax)。そして、「Save cake」をクリックすると、すべてがDatabaseにコミットされます。私は自分自身を明確にした?

以下

私が今までやったことです:

0 ingredient.rb

routes.rbを

Rails.application.routes.draw do 
    resources :cakes do 
    resources :ingredients do 
     member do 
     get 'add', to: 'cakes#add' 
     get 'remove', to: 'cakes#remove' 
     end 
    end 
    end 

    resources :ingredients 

end 

cake.rb

class Cake < ActiveRecord::Base 
    has_many :recipes 
    has_many :ingredients, through: :recipes 
end 

recipe.rb

class Recipe < ActiveRecord::Base 
    belongs_to :cake 
    belongs_to :ingredient 
end 

cakes_controller.tb

class CakesController < ApplicationController 
    before_action :set_cake, only: [:show, :edit, :update, :destroy] 
    before_action :set_ingredients, only: [:new, :edit] 

    def index 
    @cakes = Cake.all 
    end 

    def show 

    end 

    def new 
    @cake = Cake.new 
    end 

    def edit 

    end 

    def create 
    @cake = Cake.new(cake_params) 
    @cake.save 
    redirect_to cakes_path 
    end 

    private 
      def cake_params 
      params.require(:cake).permit(:name) 
      end 

      def set_cake 
      @cake = Cake.find(params[:id]) 
      @used_ingredients = @cake.ingredients 
      end 

      def set_ingredients 
      @ingredients = Ingredient.all 
      end 

end 

フォームケーキに - _form.html.erb

<%= form_for @cake do |f| %> 
<p> 
    <%= f.label :name %> 
    <%= f.text_field :name%> 
</p> 
<div id="used ingredients" > 
    <%= render 'recipe_ingredients'%> 
</div> 
<div id="available ingredients" > 
    <%= render 'available_ingredients'%> 
</div> 
<p> 
    <%= f.submit%> 
</p> 
<% end %> 

すでにレシピのの成分 - _recipe_ingredients.html.erb

<table border="1px"> 
<tr> 
    <th colspan="2">Used Ingredients</th> 
</tr> 

<% @used_ingredients.each do |ingredient| %> 
    <tr> 
     <td> <%= ingredient.name %> </td> 
     <td> <%= link_to 'Remove', remove_cake_ingredient_path(@cake,ingredient), remote: true %> </td> 
    </tr> 
<% end %> 

</table> 

入手可能な成分 - 私はこだわっているところ

<table border="1px"> 
<tr> 
    <th colspan="2">Available Ingredients</th> 
</tr> 

<% @ingredients.each do |ingredient| %> 
    <tr> 
     <td> <%= ingredient.name %> </td> 
     <td> <%= link_to 'Add', add_cake_ingredient_path(@cake,ingredient), remote: true %> </td> 
    </tr> 
<% end %> 

</table> 

_available_ingredients.html.erbここでは、項目を追加または削除する方法、です@ cake.ingredientsからデータベースにコミットせずに、ページをリロードせずにレシピ成分のリストをリロードしてください(実際には、リストをリロードしてください。 しかし、ここでのトリックは、「追加」または「削除」リンクをクリックし、レシピに成分を追加または除去し、「ケーキを保存」送信ボタンの後にのみコミットすることです。ユーザーが心を変えた場合は、変更をキャンセルしてください。だから私はデータベースではなく、オブジェクトリストを操作する必要があります。

誰でも手伝ってもらえますか?

PS:1 - 私はリモートで知っています:リンク上でtrueを指定すると、action.js.erbファイルが生成されます。それは私には明らかです。問題は、リンクの追加/削除のたびに同じオブジェクト(@ cake.recipes)で作業できないことです。別のテストでは、グローバルなハッシュ$原料を作ったが、それはRubierモードだとは思わない。

2 - 私はすべての利用可能な食材を使用し、テーブル(グリッド)を作ったが、それは選択またはcollection_selectことculdが、私は複数を使用したくない:trueオプション

3は - たぶん、いくつかあります誰かが知っていれば、私が必要とすることをする宝石。

答えて

0

ルチアーノ、

は、なぜあなたはケーキを作成できませんでしたし、その後成分を添加する方法は、あなたのデシベルの漸進的変化をもたらすのだろうか?なぜそれがすべてクライアント側で完結しなければならないのか(また、ユーザーが仕事を失うリスクを増大させる)

クライアントサイドで実行したい場合は、コミットする準備ができるまでバックエンドへの移動を避けます。フォーム要素をユーザーが選択したときに動的に追加するには、JSを提供する必要があります。

あなたの質問にお答えします: 1)グローバルを使用しないでください...それはRubyではないだけでなく、複数のユーザーがいる場合はうまくいかないでしょう。しかし、あなたが望むのであれば自由にセッションを利用することができますが、一般的には不本意ですが、必要でない場合もあります。上記のようにモデルを段階的に構築する場合は、これを完全に避けてください。

2)を見てみましょう「選ばれた」..それは非常に強力であり、私はそれがあなたの要件

3)あなたが最初の学習Railsのあるときに宝石を使用しないようにしてくださいを満たすと考えている選択JS。大規模なプロジェクトチームで見つかった宝飾品の驚異的な量は、新しいチームメンバーのスピードアップをますます困難にしています。ほとんどのプロジェクトは何百もの宝石を持っていますが、通常、ほとんどのアプリケーションではほとんどが(あるいはほとんどデフォルトになって)知られています。

+0

こんにちはilan berciありがとうございました。 dbに直接保存する場合は問題ありません。しかし、私が学んでいるように、私はそれをどうやって行うのかよく知っています。 1 - 私は実際には、美しさではないと考えています。 2 - ありがとう、それは素晴らしいようです。 3 - 入手しました。 –

+0

私はDesk(Delphi/VS)開発者からWebに変わっているので、私が知っているすべてを学ぶ必要があります。たとえば、自分のモデルやアソシエーションを正しい方法で作れば、100%確信できません。それは多くのまたは1つ(POVに応じて)のレシピと多くの成分を持つ各レシピを持つより論理的なケーキだと思われるので、レシピと食材を使った別の結合モデルが必要になると思います。 それで、私はここに来て、この質問をして、私が正しい方法で行って、何かをしようとしているかどうか、私は始める方法がわからないのか見ています。 –

関連する問題