Rails で簡単なディスカッション ボードを作成しています。すべての新しいものは、コンテンツを含むTopic
最初のものも作成Reply
します。これが私の現在のスキーマです。
Topic
> title:string
> user_id: integer
has_many :replies
accepts_nested_attributes_for :replies
Reply
> topic_id: integer
> user_id: integer
> content: text
belongs_to :topic
電流topics/_form.html.haml
はこんな感じ
= form_for @topic fo |f|
= f.text_field :title
= f.fields_for :replies
= reply.text_area :content
問題は、トピックを編集しようとすると、fields_for :replies
部分的なフォームでフィールドを繰り返しているため、返信のすべてのリストが編集可能として表示されることです。最初だけ見ればいいのに。
トピックが新しい場合に新しいものを構築しながら、この反復を現在の最初の利用可能な返信のみに制限する便利な方法は何でしょうか?
私はこのような作品になりましたが、もっと良い方法があるはずです。
# Topic model
has_one :owner_reply, class_name: 'Reply'
accepts_nested_attributes_for :owner_reply
# Form partial view
= form_for @topic fo |f|
- reply_resource = (@topic.new_record? ? :replies : :owner_reply)
= f.text_field :title
= f.fields_for :replies
= reply.text_area :content
これらはフルTopicsController#create
とupdate
アクションです。
def create
@board = Board.find(params[:board_id])
@topic = @board.topics.new(topic_params)
@topic.user_id = current_user.id
@topic.replies.each { |reply| reply.user_id = current_user.id }
if @topic.save
respond_to do |format|
format.html { redirect_to topic_path(@topic) }
end
else
render :new
end
end
def update
@topic = Topic.find(params[:id])
if @topic.update_attributes(topic_params)
respond_to do |format|
format.html { redirect_to topic_path(@topic) }
end
else
render :edit
end
end