2016-09-22 1 views
0

Ich baue einen einfachen Rezensenten Blog Post auf Schienen 5, um mich selbst zu unterrichten. Es ist ein Video Game Reviewer, wo Benutzer Bewertungen über die letzten Spiele, die sie gespielt haben, schreiben können. Benutzer können Kommentare auch zu Bewertungen hinzufügen.Benutzerdefinierte Attribut-Setter-Methode in geschachtelten Formularen

Ich möchte einen benutzerdefinierten Attribut-Writer auf meinem Spielmodell durch verschachtelte Formulare implementieren. Wenn ein Benutzer ein Spiel zum ersten Mal auflistet, möchte ich auch, dass er in der Lage ist, eine Rezension für dieses Spiel vor Ort zu schreiben.

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 

Spiele/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 %> 

Bewertungen/form Teil

<%= 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 

Aus irgendeinem Grunde halte ich Bewertungen immer ungültig ist, wenn ich versuche, eine neue Bewertung mit einem Spiel durch meine verschachtelten Formen assoziiert zu erstellen. Meine error_messages partially rendert die Fehlermeldung: "1 Fehler hat das Speichern verhindert: Reviews ist ungültig".

Etwas über die Überprüfung Formulare oder Daten in der Params-Hash wird nicht übertragen, denke ich. Ich bin mir nicht sicher warum. Ich habe sogar versucht, die Assoziationen mit dem eingebauten Rails-Helper zu erstellen: accresents_nested_attributes_for und ich bekomme immer noch den gleichen Fehler. Hier

ist der Link zu meinem Repo für volle Klarheit: https://github.com/jchu4483/Rails-Assessment-

Danke, und jede Hilfe oder Beratung wird geschätzt.

+0

Versuchen Sie '' id' zu 'reviews_attributes' in Ihren starken params hinzuzufügen:' reviews_attributes: [: id,: rating,: content,: user_id] ' – Ren

+0

Ich habe es gerade versucht und es gibt mir den gleichen Fehler. –

Antwort

0

Jetzt denke ich, dass das Problem möglicherweise verschachtelten Formen mit has_many und through Assoziationen sein kann. Ihre Überprüfung gibt die Validierung nicht weiter, da sie ebenfalls dem Benutzermodell zugeordnet ist. Ihre Beurteilung Modell accepts_nested_attributes_for Benutzer

class Review < ApplicationRecord 
    belongs_to :user 
    belongs_to :game 

    accepts_nested_attributes_for :user 
end 

haben sollte und Sie sollten noch eine weitere fields_for für den Benutzer

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

und in Ihrem Controller in game_params haben bilden Sie für users_attributes ein Array passieren zu

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

Die Antwort auf diese Frage zu SO kann hilfreich sein: https://stackoverflow.com/a/21983998/5531936

+0

Ich habe das auch ausprobiert und immer noch den gleichen Fehler. –

+0

liefert der Fehler eine Quelldatei und eine Codezeilennummer? Können Sie sagen, worauf sich der Fehler bezieht? – Ren

+0

Eigentlich gibt es keinen ActiveRecord oder Rails Error, mein error_messages partial rendern die Fehlermeldung mit dem Wortlaut: "1 Fehler beim Speichern dieser Datei: Bewertungen ist ungültig". Etwas über die Überprüfungsformulare oder -daten im params-Hash wird nicht übertragen, denke ich. –

1

Es sieht so aus, als ob die Attribute in deinen reviews_attributes in den game_params nicht mit den Attributen auf dem Formular übereinstimmen. Game_params listet Bewertung, Inhalt, user_id auf. In der Form haben Sie Titel, Inhalt, Partitur.

Verwandte Themen