1

ネストされた属性があり、値を表示できますが、データベースに保存されないのはなぜですか?

モデルがreviewあり、属性をネストしたいcomments

移行ファイルを確認する

class CreateReviews < ActiveRecord::Migration
  def change
    create_table :reviews do |t|
      t.belongs_to :reviewable, polymorphic: true
      t.timestamps
    end
    add_index :reviews, [:reviewable_id, :reviewable_type]

  end
end

モデルのレビュー

class Review < ActiveRecord::Base
  attr_accessible :rating, :user_id, :comments_attributes, :service
  has_many :comments, as: :commentable
  belongs_to :user
  belongs_to :reviewable, polymorphic: true

  accepts_nested_attributes_for :comments

end

コメント移行ファイル

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :content
      t.belongs_to :commentable, polymorphic: true
      t.integer :user_id
      t.timestamps
    end
    add_index :comments, [:commentable_id, :commentable_type]
  end
end

コメントモデル

class Comment < ActiveRecord::Base
  attr_accessible :content, :user_id
  belongs_to :commentable, polymorphic: true
  belongs_to :user
  belongs_to :review
end

これがフォームです

<%= form_for [@reviewable, @review], :html => {:multipart => true} do |f| %>

  <%= f.fields_for :comments, @review.comments.build do |field| %>
    <%= field.label "Comment" %></div>
    <%= field.text_field :content %>
  <% end %>

  <%= f.submit %>
<% end %>

フィールドが表示されますが、保存すると保存されないのはなぜですか?

以下のように表示してみました。

<%= @review.comments %>

これが私のレビューコントローラーです

  def new
    @review = @reviewable.reviews.new
    @review.comments.build
  end

ご協力いただきありがとうございます!

編集:

コントローラーのレビュー: メソッドの作成

  def create
    @review = @reviewable.reviews.new(params[:review])
    @review.user = current_user
    if @review.save
      redirect_to @reviewable, notice: "review created."
    else
      render :new
    end
  end
4

2 に答える 2

0

コントローラーとビューに混乱したロジックがあるようです

  def new
    @review = @reviewable.reviews.new
    @review.comments.build
  end

ここで を呼び出していますが@reviewable.reviews.new@reviewableまだ存在していません。これを呼び出すより一般的な方法は次のとおりです。Review.new

あなたの見解では、次にこれを行います

<%= form_for [@reviewable, @review], :html => {:multipart => true} do |f| %>

  <%= f.fields_for :comments, @review.comments.build do |field| %>

@reviewableこれはとに渡さ@reviewform_forます。これは奇妙に思えます。ネストを使用すると、通常、最上位のインスタンス変数、つまり@review.

次に、あなたがたどり着いたら、とfields_forを渡します。一般的に言えば、コントローラーで既にコメントを作成しているため、これには のみが必要です。:comments@review.comments.build:comment

これらの 2 つのスクリーンキャストを確認することをお勧めします

http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2

物事を非常に雄弁にコメントできるようにするプロセス全体を処理する多くの Gem もあります。ここで見つけることができます

https://www.ruby-toolbox.com/categories/rails_comments

コメント可能な Gems パスの方が優れていると思います。なぜなら、それらはより大きなコミュニティによって取り組まれているからです。長期的には、個人の作成よりも優れていると思います。

お役に立てれば...

于 2013-06-14T05:04:55.450 に答える