2016-09-22 2 views
0

Я создаю простой отчет в блоге рецензента на Rails 5, чтобы научить себя. Его рецензент видеоигр, где пользователи могут писать обзоры последних игр, в которые они играли. Пользователи также могут добавлять комментарии к отзывам.Метод настраиваемого атрибута в вложенных формах

Я хочу внедрить создателя настраиваемого атрибута на моей игровой модели через вложенные формы. Когда пользователь впервые перечисляет игру, я также хочу, чтобы они могли написать «Обзор для этой игры» на месте.

Game.rb

class Game < ApplicationRecord 
    has_many :reviews, dependent: :destroy 
    has_many :users, through: :reviews 

    validates :title, presence: true 

    def reviews_attributes=(reviews_attributes) 
    reviews_attributes.values.each do |review_attributes| 
     self.reviews.build(review_attributes) 
    end 
    end 
end 

игры/new.html.erb

<h1>Enter a new Game</h1> 

<%= form_for @game do |f| %> 
    <%= render 'shared/error_messages', object: @game %> 
    <%= render 'new_form', f: f %> 
    <br><br> 
    Review: 
    <br> 
    <%= f.fields_for :reviews, @game.reviews.build do |r| %> 
    <%= render 'reviews/form', f: r %> 

    <%= f.submit "Add Game and/or Review!" %> 
    <% end %> 
<% end %> 

Обзоры/форма частичной

<%= f.label :title %> 
    <%= f.text_field :title %> 

    <br> 
    <%= f.label :content %> 
    <%= f.text_area :content %> 

    <br> 
    <%= f.label :score %> 
    <%= f.text_field :score %> 

    <%= f.hidden_field :user_id, :value => current_user.id %> 

Games_Controller.rb

def create 
    @game = Game.new(game_params) 
    if @game.save 
     redirect_to @game 
    else 
     render :new 
    end 
    end 

    private 
    def game_params 
     params.require(:game).permit(:title, :platform, reviews_attributes: [:rating, :content, :user_id]) 
    end 

По некоторым причинам я получаю отзывы недействителен всякий раз, когда я пытаюсь создать новый отзыв, связанный с игрой через мои вложенные формы. Моя частичная ошибка error_messages выводит сообщение об ошибке: «1 ошибка запретила это сохранять: отзывы недействительны».

Кое-что о просмотренных формах или данных в хэше params не передается. Я не знаю, почему. Я даже попытался построить ассоциации со встроенным помощником Rails: accepts_nested_attributes_for, и я по-прежнему получаю ту же ошибку.

Вот ссылка на мой репозиторий для полной ясности: https://github.com/jchu4483/Rails-Assessment-

Спасибо, и любая помощь или совет ценится.

+0

Попробуйте добавить ': id' в' reviews_attributes' в свои сильные параметры: 'reviews_attributes: [: id,: rating,: content,: user_id]' – Ren

+0

Я просто попробовал это и дал мне ту же ошибку. –

ответ

0

Теперь я думаю, что проблема может быть из-за вложенных форм с ассоциациями has_many и through. Ваш отзыв не проходит проверку, так как он также присоединяется к модели User. Ваша модель Обзор должен иметь accepts_nested_attributes_for Пользователь

class Review < ApplicationRecord 
    belongs_to :user 
    belongs_to :game 

    accepts_nested_attributes_for :user 
end 

и вы формируете должны иметь еще один fields_for для пользователя

<%= form_for @game do |f| %> 
    <%= f.fields_for :reviews do |r| %> 
     <%= r.fields_for :users do |u| %> 
     ... 
     <% end %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

и в контроллере в game_params вам нужно передать массив для users_attributes слишком

def game_params 
    params.require(:game).permit(:title, :platform, reviews_attributes: [:id, :rating, :content, :user_id, user_attributes: [...]) 
end 

Ответ на этот вопрос может быть полезен: https://stackoverflow.com/a/21983998/5531936

+0

Я также пробовал это и по-прежнему ту же ошибку. –

+0

делает ли ошибка исходным файлом и номером строки кода? Можете ли вы сказать, на что именно ссылается ошибка? – Ren

+0

На самом деле, нет ошибки ActiveRecord или Rails, мои частичные ошибки error_messages отображают сообщение об ошибке: «1 ошибка запретила это сохранять: отзывы недействительны». Что-то вроде формы или данных обзора в хэше params не передается, я думаю. –

1

Похоже, что атрибуты ваших отзывов_attrbitues в game_params не соответствуют атрибутам формы. Game_params перечисляет рейтинг, контент, user_id. В форме у вас есть заголовок, контент, оценка.