В зависимости от того, что вы хотите сделать, я вижу два варианта.
Вариант 1. Используйте текстовое поле для создания или поиска существующей темы (как у вас). В вашем контроллере вы бы написали что-то вроде:
def create
topic_name = params[:post].delete(:topic)
@topic = Topic.find_or_create_by_name(topic_name)
@post = Post.new(params[:post])
@post.topic = @topic
if @post.save
format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
else
format.html { render :action => "new" }
end
end
Это быстрый и грязный путь. Для каждого введенного вами topic
он будет пытаться найти эту тему по имени или создать ее и назначить. Но это подвержено ошибкам. Если ваш набор тем ограничен, есть гораздо более простой способ.
Вариант 2: использовать поле выбора, список доступных тем. На ваш взгляд напишите:
<%= simple_form_for @post do |f| %>
<h1>Create a Post</h1>
<%= f.input :name, :label => false, :placeholder => "Name" %>
<%= f.input :title, :label => false, :placeholder => "Title" %>
<%= f.input :content, :label => false, :placeholder => "Content" %>
<%= f.association :topic %>
<%= f.button :submit, "Post" %>
<% end %>
Это сделает окно выбора с возможными темами. И в вашем контроллере вы просто должны написать:
def create
@post = Post.new(params[:post])
if @post.save
format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
else
format.html { render :action => "new" }
end
end
Хотя этот второй вариант действительно прост, добавлять темы на лету не так просто. Вы можете сделать что-то промежуточное, используя поле автозаполнения, которое позволит либо искать значения, если они существуют, либо добавлять новые значения, если они не существуют.
Надеюсь, это поможет.