2013-12-22 1 views
0

У меня есть три таблицы: рецепты, альбомы для вырезок и scrapbook_entries.Как сделать форму для добавления в таблицу соединений

Моего scrapbook_entries является объединение таблицы, содержащей (: recipe_id и: scrapbook_id)

Рецепта и записки уже существуют, и я пытаюсь сделать форму, которая позволяет пользователю выбрать альбом для вырезок (из current_user.scrapbooks) а затем нажмите «сохранить», который примет текущий рецепт (форма будет в режиме рецепта) и добавьте scrapbook_id и recipe_id в таблицу scrabook_entries.

У меня уже есть модель scrapbook_entries и контроллер. Мой контроллер выглядит следующим образом:

class ScrapbookEntriesController < ApplicationController 

def create 
    @recipe = current_user.recipes.find(params[:recipe_id]) 
    @scrapbook = current_user.scrapbooks.find(params[:scrapbook_id]) 
    @entry = current_user.scrapbook_entries.build(scrapbook: @scrapbook) 
    if @entry.save 
     flash[:success] = "Added '#{@recipe.name}' to scrapbook '#{@scrapbook.name}'" 
    else 
     flash[:error] = "Could not add to scrapbook" 
    end 
    redirect_to @recipe 
end 

end 

Моя форма в окне рецепта выглядит следующим образом:

<%= form_for(@scrapbook_entry, :url => scrapbook_entries_path(params[:id])) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <%= f.number_field :scrapbook_id, placeholder: "Scrapbook ID" %> 
    <%= f.hidden_field :recipe_id, :value => @recipe.id %> 
    <%= f.submit "Post", class: "btn btn-large btn-primary" %> 
<% end %> 

Как вы можете видеть в данный момент пользователь просто должен ввести scrapbook_id он/она хочет сохраните его. В конечном итоге я бы хотел добавить список вырезок в избранном поле, но у меня были проблемы с этим, поэтому любые предложения были бы приветствованы!

Моя форма в настоящее время отображает ошибку «Не удалось найти рецепт без идентификатора» в контроллере после нажатия кнопки «Отправить». Любые идеи, что я делаю неправильно здесь?

EDIT:

scrapbook.rb

belongs_to :user 
has_many :recipes, through: :scrapbook_entries 
has_many :scrapbook_entries 

recipe.rb

belongs_to :user 
has_many :scrapbooks, through: :scrapbook_entries 

scrapbook_entry.rb

has_one :recipe 
has_one :scrapbook 

ответ

1

вы видите эту ошибку, потому что form_for места поля в вложенной хэш в params. Ключ для этого вложенного хэша основан на имени класса объекта модели. Попробуйте это:

@recipe = Recipe.find(params[:scrapbook_entry][:recipe_id]) 

Вы также получите ошибку на линии @entry = current_user.scrapbook_entries ... потому User не связан непосредственно с ScrapbookEntry. Вместо этого создайте запись из записки:

@entry = @scrapbook.scrapbook_entries.build(recipe: @recipe) 
+0

Это сработало Я имею идентификатор рецепта, но теперь я получаю сообщение «Не могу найти рецепт с id = 357 [WHERE» recipes. "User_id" =?] "Ошибка? – MikeHolford

+0

Какова ценность 'current_user'? – jonahb

+0

current_user имеет пользователя, прикрепленного к нему, если это то, что вы просите? Ввод в current_user в оболочку ошибок дает мне хэш подписанного пользователя – MikeHolford

1

вам можете попробовать с этим

<%=f.select(:scrapbook_id, Scrapbook.all.collect {|p| [ p.id, p.id ] }, {prompt: 'scrapbook'})%> 

и если вы можете создать правильный хэш, поэтому вам не нужно назначать все вручную. Также я не могу видеть рецепт получения назначен так просто передать весь хэш как этот

current_user.scrapbook_entries.build(params[:scrapbook_entry]) 
+0

Проблема с первой строкой заключается в том, что я хочу показать вырезки, принадлежащие current_user. И со второй строкой кода, которую вы предложили, вы имеете в виду, что я должен просто удалить строки рецепта и вырезки из контроллера и просто указать запись? – MikeHolford

+0

Тогда не будет current_user.scrapbooks.collect (...) вместо этого решить эту проблему? –

+0

для первого вы можете изменить его на <% = f.select (: scrapbook_id, current_user.scrapbooks.collect {| p | [p.id, p.id]}, {prompt: 'scrapbook'})%> и да для второго лучше будет удалить линию рецептов и вырезки. –

Смежные вопросы