2016-06-26 4 views
1

Ich arbeite an einem Rails 4-Projekt und habe derzeit einen Kommentarabschnitt, der an einen Gruppenabschnitt gebunden ist - die Gruppe ist fast wie ein Blog. Ich brauche die Gruppen-ID-Nummer, die mit einem neuen Kommentar verknüpft werden soll. Ich möchte nicht, dass der Benutzer die Gruppen-ID auswählt, sondern stattdessen automatisch angezeigt wird. Ich habe dies zur Zeit in meinem Kommentar, mein Problem die letzte Form-Gruppe mit der Gruppen-ID in Form kommt:undefinierter lokaler Variablen- oder Methodenfehler - Versuch, einen Kommentar mit einem Blog zu verknüpfen

<div class="form-group"> 
    <%= form.label :author %> 
    <%= form.text_field :author, autofocus: true, class: "form-control",  
     placeholder: "Author's Name" %> 
    </div> 

    <div class="form-group"> 
    <%= form.label :comment %> 
    <%= form.text_field :comment, class: "form-control", placeholder: "Write 
    your hearts content" %> 
    </div> 

    <div class="hide"> 
    <%= form.number_field :user_id, value: current_user.id %> 
</div> 

<div class="form-group"> 
    <%= form.number_field :group_id, value: group.id %> 
</div> 

Was will ich so etwas wie das tun muß, ist: user_id, Wert: current_user.id arbeite mit jeder Gruppe. Die Benutzer-ID-Zeile funktioniert einwandfrei und ich habe keine Probleme damit. Es ist nur, dass die Gruppe Linie, die ich die folgende Fehlermeldung: undefined lokale Variable oder Methode `Gruppe‘ für # < #: 0x007f873a161fc0>

Mein Schema wie folgt aussieht: Schließlich

create_table "comments", force: :cascade do |t| 
    t.string "author" 
    t.text  "comment" 
    t.integer "user_id" 
    t.integer "group_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "groups", force: :cascade do |t| 
    t.string "topic" 
    t.integer "user_id" 
    t.text  "description" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.float "latitude" 
    t.float "longitude" 
    t.string "address" 
    t.string "city" 
    t.string "state" 
    end 

, meine Kommentare Controller sieht wie folgt aus:

class CommentsController < ApplicationController 

def new 
    @comment = Comment.new 
end 

def create 
    @comment = Comment.new(comment_params) 
    if @comment.save 
    redirect_to @group 
    else 
    render 'new' 
    end 
end 

def edit 
end 

def update 
end 

private 

def comment_params 
    params.require(:comment).permit(:author, :comment, :user_id, :group_id) 
end 

end 

Bitte lassen Sie mich wissen, wenn weitere Informationen benötigt werden. Danke für die Hilfe!

Hier werden die Modelle für Gruppen und Kommentare sind: Kommentar:

class Comment < ActiveRecord::Base 
    belongs_to :group 
end 

Gruppen:

class Group < ActiveRecord::Base 
    has_many :collections 
    has_many :comments 
    has_many :users, :through => :collections 

    validates :topic, presence: true 
    validates :description, presence: true, length: { minimum: 10 } 

    geocoded_by :address 
    after_validation :geocode 
end 
+0

können Sie auch Quelle für Ihre Modelle Dateien Kommentar und Gruppe anzeigen. –

+0

Was meinen Sie mit Quelle? –

+0

Ich meine models/comment.rb –

Antwort

1

Ohne die :value Option in einem form_for Methode angeben, folgert Rails automatisch den Wert aus der Spalte Name, also sollte es wie folgt auslassen, sollte für Ihren spezifischen Anwendungsfall funktionieren, andernfalls, anstatt auf group zu verweisen, verwenden Sie @comment.group_id:

<div class="form-group"> 
    <%= form.label :author %> 
    <%= form.text_field :author, autofocus: true, class: "form-control",  
     placeholder: "Author's Name" %> 
    </div> 

    <div class="form-group"> 
    <%= form.label :comment %> 
    <%= form.text_field :comment, class: "form-control", placeholder: "Write 
    your hearts content" %> 
    </div> 

    <div class="hide"> 
    <%= form.number_field :user_id, value: current_user.id %> 
</div> 

<div class="form-group"> 
    <%= form.number_field :group_id %> 
</div> 

Allerdings bin ich mir nicht ganz sicher, ob Sie ein paar Dinge richtig angehen.

Einige sofortige Änderungen, würde ich wahrscheinlich würde vorschlagen:

Verwenden verschachtelte Routen:

# routes.rb 
resources :groups do 
    resources :comments 
end 

In Ihrem CommentsController Sie nun die group_id von der Strecke holen konnte:

def create 
    group = Group.find(params[:group_id]) 
    @comment = current_user.comments.new(comment_params) 
    @comment.group = group 
    if @comment.save 
    redirect_to group 
    else 
    render 'new' 
    end 
end 

private 
    def comment_params 
    params.require(:comment).permit(:author, :comment) 
    end 

Auf diese Weise könnten Sie aus Ihrer Sicht leicht Folgendes tun:

<div class="form-group"> 
    <%= form.label :author %> 
    <%= form.text_field :author, autofocus: true, class: "form-control",  
     placeholder: "Author's Name" %> 
    </div> 

    <div class="form-group"> 
    <%= form.label :comment %> 
    <%= form.text_field :comment, class: "form-control", placeholder: "Write 
    your hearts content" %> 
    </div> 

Hinweis:: user_id und: group_id wurden aus den Formularfeldern entfernt, da diese Mappings jetzt auf der Controller-Ebene ausgeführt werden.

Lesen Sie mehr über nested routes and nested resources here

UPDATE

Für einen neuen Kommentar, der group_id Null sein würde, weil dieser nicht es noch in Verbindung gebracht worden (einer der Vorteile von verschachtelten Ressourcen), aber wenn Sie wissen im Voraus, was die group sein könnte, möchten Sie vielleicht versuchen:

@comment = group.comments.build

und stattdessen th verwenden Der Wert dieses @comment.

+0

Oreoluwa-Ich denke du hast mir früher in der Woche geholfen! Ich habe versucht, <% = form.number_field: group_id%> und es hat nicht funktioniert. Die group_id war immer noch null für den Kommentar. Ich werde verschachtelte Routen ausprobieren, aber ich habe versucht, mich von ihnen fernzuhalten - aus irgendeinem Grund sind sie ein bisschen verwirrender für mich, aber ich habe viele Projekte mit ihnen gemacht - ich hoffte, ich könnte das tun, ohne sie zu benutzen! –

+0

Ich bin froh, dass ich helfen konnte. Ich habe meine Antwort aktualisiert, um zu erklären, warum die Gruppe "null" ist. Die Frage ist, woher weiß der Benutzer, zu welcher Gruppe ein Kommentar gehören soll? Wenn Sie Zugriff darauf haben, können Sie einfach Ihre '@comment = [@group] .comments.build' setzen. Ich hoffe das ergibt Sinn? – oreoluwa

0

Wenn Sie einen Kommentar erstellen wissen Sie, zu welcher Gruppe gehört :?

denke ich, das Problem mit dieser Linie ist

<%= form.number_field :group_id, value: group.id %> 

So zuweisen Sie eine ID, aber Ihre Gruppe initialisiert wird, nicht. Können Sie so etwas wie dieses innerhalb neue Methode

def new 
    @group = Group.find(...) # load a group here and assign below 
    @comment = Comment.new(group: @group) 
end 

Sie können es auch tun Refactoring, wenn Sie einen Kommentar, den Sie getestet Weg gehen wie/Gruppen/ID/Kommentare erstellen und dann die Gruppen-ID innerhalb params sein

Hoffe, es

+0

Ja, das Problem liegt in der Zeile: <% = form.number_field: group_id, value: group.id%>. Was sollte ich in die neue Methode einfügen: sollte es @group = Group.find (params [: id]) sein? –

+0

Kennen Sie die Gruppe, zu der der Kommentar gehört ... laden Sie einfach die @group zum Beispiel @group = Group.find (params [: group_id] oder etwas ... also die Frage ist, woher wissen Sie, zu welcher Gruppe Ihr Kommentar gehört zu? –

+0

Wenn Sie zu den Kommentaren route gehen, wie ist die Gruppe referenziert? Können Sie auch Ihre Router-Datei? –

0

hilft, wenn Sie dann, welche Gruppe einen Kommentar sollte wissen, gehören dir Sie so etwas wie dieses

class CommentsController < ApplicationController 
    def new 
    @group = Group.find(...) 
    @comment = Comment.new 
    end 

    def create 
    comment = Comment.create(comments_params) 
    if comment.save 
     redirect_to comments_path 
    else 
     redirect_to :new 
    end 
    end 

    private 

    def comments_params 
    params.require(:comment).permit(:body, :group_id) 
    end 
end 

und in Ihrem Formular tun könnte cou ld haben Sie Ihren Kommentar mit dieser Gruppe verbunden

<%= f.number_field :group_id, value: @group.id %> 
+0

Was genau würde in der @group = Group.find (...) => speziell der Fundteil gehen? Ich habe mein Problem mit verschachtelten Routen gelöst, war aber neugierig auf diese andere Methode. –

+0

Group.find group_id, zu der dieser bestimmte Kommentar gehören soll – Saad

Verwandte Themen