2013-06-14 3 views
1

У меня есть вложенный атрибут, и я могу отображать значения, но он не сохраняет в базу данных почему?Вложенные атрибуты не сохраняются в базе данных? Не отображает значения - Ruby on Rails

У меня есть модель 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 

Спасибо за вашу помощь!

EDIT:

контроллер Обзор: создать метод

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 
+0

Пожалуйста, пост 'create' методу в контроллере – muttonlamb

+0

@muttonlamb Здравствуйте! Я редактировал сообщение, чтобы включить метод create. Что-то не так с этим? Благодаря! – hellomello

+0

Я не вижу никаких проблем. можете ли вы поделиться своим кодом, если это возможно, я имею в виду использование любого публичного репо? – Muntasim

ответ

-1

вам необходимо заменить следующее

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

в

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

чтобы увидеть созданные комментарии в форме. Как у вас есть @review.comments.build в новом действии. В противном случае вы не можете увидеть связанные комментарии по редактированию обзора

+0

Если я удалю .build, то поле для комментариев исчезает – hellomello

+0

вы должны иметь '@ review.comments.build' в новом действии, как я упоминал, и в действии редактирования' @review.comments.build, если @ review.comments.empty? ' – Muntasim

+0

У меня есть @ review.comments.build в новом действии (я не трогал мой предыдущий код, в котором он есть). Я также добавил последние бит в действие редактирования, тот же результат. Поле не отображается. Кроме того, я забыл упомянуть, но не уверен, если это имеет значение. Эта форма находится в 'views/reviews/_form.html.erb', но я отобразил эту страницу внутри' views/users/reviews.html.erb' – hellomello

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 и @review к form_for. Это кажется странным. При вложенности вам обычно нужно передать только переменную экземпляра верхнего уровня, то есть @review.

Далее, когда вы доберетесь до fields_for, вы проходите :comments и @review.comments.build. Вообще говоря, это должно требовать только :comment, потому что вы уже создали комментарий в контроллере.

Я рекомендую вам рассмотреть эти два скринкасты

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

Есть также ряд драгоценных камней, которые обрабатывают весь процесс изготовления вещей commentable очень красноречиво, их можно найти здесь

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

Я думаю, что замечательный путь драгоценных камней лучше, потому что они обрабатываются a la rger, и я думаю, что в конечном итоге лучше, чем личные творения в долгосрочной перспективе.

Надеется, что это помогает ...

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