#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Я хочу скопировать отношения класса A в класс B
class ShoppingList
has_many :ingredients
end
class Recipe
has_many :ingredients
end
Я хочу добавить ингредиенты рецепта в список покупок, но СО страницы рецепта (я не буду уточнять, почему, но это имеет смысл в UX). Ингредиенты — это единственное общее отношение, которое у них есть.
Логика такова: на моей странице рецептов я хочу иметь выпадающее меню, содержащее мои списки покупок. Затем, когда я выбираю список покупок и проверяю, он добавит ингредиенты рецепта в список покупок.
Я изо всех сил пытался заставить это работать, я знаю, что, возможно, я сделал несколько вещей неправильно, но вот что я попробовал :
recipes_controller.rb :
def add_ingredients_to_list
# call method to find the @recipe
tmp = ShoppingList.find_by_id(shopping_list_params[:shopping_lists])
tmp.ingredients << @recipe.ingredients
redirect_to shopping_list_path(id: tmp.id)
end
private
def shopping_list_params
params.require(:recipe).permit(:shopping_lists, :id)
end
routes.rb :
resources :recipes do
post 'add_ingredients_to_list' => "recipes#add_ingredients_to_list"
end
рецепты/show.html.erb :
<%= simple_form_for :recipe, :url => recipe_add_ingredients_to_list_url(@recipe), :method => 'post' do |f| %>
<%= f.input :id, :input_html => { :value => @recipe.id}, as: :hidden %>
<%= f.input :shopping_lists, collecton: ShoppingList.all, as: :select %>
<%= f.button :submit %>
<% end %>
С помощью этого кода я получаю эту трассировку :
Rendered recipes/show.html.erb within layouts/application (122.9ms)
Completed 500 Internal Server Error in 395ms (ActiveRecord: 109.7ms)
ActionView::Template::Error (undefined method `shopping_lists' for #<Recipe:0x000055a4c080af88>):
54: <% end %>
55: <%= simple_form_for :recipe, :url => recipe_add_ingredients_to_list_url(@recipe), :method => 'post' do |f| %>
56: <%= f.input :id, :input_html => { :value => @recipe.id}, as: :hidden %>
57: <%= f.input :shopping_lists, collecton: ShoppingList.all, as: :select %>
58: <%= f.button :submit %>
59: <% end %>
60: </div>
app/views/recipes/show.html.erb:57:in `block in _app_views_recipes_show_html_erb___4100323442142788090_47083061551380'
app/views/recipes/show.html.erb:55:in `_app_views_recipes_show_html_erb___4100323442142788090_47083061551380'
Мое лучшее предположение заключается в том, что simple_form не подходит для того, что я хочу сделать, но я действительно не знаю, как сделать эту функцию.
Не могли бы вы мне помочь?
Комментарии:
1. Где именно выдается эта ошибка? Пожалуйста, добавьте свою трассировку стека к вашему вопросу.
2. Есть ли
has_many :shopping_lists
в модели ингредиентов? Если вы, я думаю, вам просто нужноhas_many :shopping_lists, through: :ingredients
в рецепте modell3. Кроме того, как выглядит ваша
Ingredient
модель? В частности, его ассоциации.4. @jvillian: я добавил трассировку strack
5. @maxpleaner: я могу получить доступ к странице, добавив вашу строку в свою модель, но затем выпадающее меню дает мне только два варианта: «да» или «нет»