0

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#createupdateアクションです。

  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
4

2 に答える 2

1

使用しているのと同じ方法でスコープ付きの関連付けを使用しますが:owner_reply、スコープを追加して最初のレコードに制限します。必要に応じて、それに a を追加することもできorderます

class Topic
has_many :replies
has_many :first_replies, -> { first }, class_name: 'Reply'
accepts_nested_attributes_for :replies
accepts_nested_attributes_for :first_replies

そしてあなたの見解では

= form_for @topic fo |f|
  ...
  = f.fields_for :first_replies
    = reply.text_area :content
于 2013-07-23T03:23:45.900 に答える
1

Topic最初の を返すクラス メソッドを on に作成しますReply

class Topic
  accepts_nested_attributes_for :first_reply

  def self.first_reply
    self.replies.first
  end
  # ...
end

次に、 でクラス メソッドを呼び出しますfields_for

于 2013-07-23T03:31:37.143 に答える