私はRailsの世界が初めてです。もっと学習するためにいくつかのサンプルアプリケーションを試しています。私は立ち往生しており、何か助けていただければ幸いです。私は成功しないで同様の質問を探しました。しかし、私はそこに1つがあると思います。Rails - テーブルまたは選択して関連付けに追加
ケースは次のとおりです。レシピを通じた成分が多いケーキモデルがあります。作成、編集、削除はOkです。私がすでに学んだ基礎です。しかし、私は、ケーキを作成(または編集)しながら、そのレシピに既に入っているすべての成分を見ることができるようにしたい(完了)し、選択したものから選択するか、レシピから追加または削除する。このすべてをデータベースにコミットせずに、ページをリロードしないでください(Ajax)。そして、「Save cake」をクリックすると、すべてがDatabaseにコミットされます。私は自分自身を明確にした?
以下私が今までやったことです:
0 ingredient.rbroutes.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は - たぶん、いくつかあります誰かが知っていれば、私が必要とすることをする宝石。
こんにちはilan berciありがとうございました。 dbに直接保存する場合は問題ありません。しかし、私が学んでいるように、私はそれをどうやって行うのかよく知っています。 1 - 私は実際には、美しさではないと考えています。 2 - ありがとう、それは素晴らしいようです。 3 - 入手しました。 –
私はDesk(Delphi/VS)開発者からWebに変わっているので、私が知っているすべてを学ぶ必要があります。たとえば、自分のモデルやアソシエーションを正しい方法で作れば、100%確信できません。それは多くのまたは1つ(POVに応じて)のレシピと多くの成分を持つ各レシピを持つより論理的なケーキだと思われるので、レシピと食材を使った別の結合モデルが必要になると思います。 それで、私はここに来て、この質問をして、私が正しい方法で行って、何かをしようとしているかどうか、私は始める方法がわからないのか見ています。 –