2016-12-01 2 views
0

ich eine einfache Variante des einfachen Beispiels von Ajax in Schienen zu machen war: http://guides.rubyonrails.org/working_with_javascript_in_rails.html#a-simple-exampleSchienen Ajax alle partials zu überschreiben, wenn erfrischende Seite

Ich versuche, eine Benutzer-Show Ansicht zu erstellen, in denen neue Beiträge auf Knopfdruck erstellt werden . Diese Beiträge werden alle unterhalb des Nutzers auf der gleichen Anzeigenseite aufgelistet und erscheinen bei der Erstellung.

Die Beiträge werden erstellt, fein und richtig auf der Seite angezeigt, aber wenn ich die Seite meiner

@post = User.posts.build() 

überschreibt alle zuvor erstellten Beiträge jedem von ihnen eine nul id geben aufzufrischen. Ist es auch korrekt, create.js.erb in den Views-Ordnern zu platzieren, oder sollte es im Ordner "assets/javascripts" liegen?

Hier sind meine Dateien:

Userscontroller

def show 
    @user = User.find(params[:id]) 
    @posts = Post.all 
    @post = @user.posts.build 
end 

Benutzer/show.html.erb

<%= "user-id: #{@user.id}" %> 

<ul id="posts"> 
<%= render :partial => @posts %> 
</ul> 


<%= form_for(@post, remote: true) do |f| %> 
    <%= f.hidden_field :user_id, :value => @user.id %> 
    <%= f.submit %> 
<% end %> 

Posts

def create 
    puts params[:post][:user_id] 
    @user = User.find(params[:post][:user_id]) 
    puts @user 
    @post = @user.posts.build() 
    respond_to do |format| 
    if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.js {} 
     format.json { render json: @post, status: :created, location: @post } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
    end 
    Rails.logger.info(@post.errors.inspect) 
    end 
end 

def index 
    @posts = Post.all 
    @post = Post.new 
end 

Beiträge/_post.html.erb

<li><%= @post.id %></li> 

Beiträge/create.js.erb

$("<%= escape_javascript(render @post) %>").appendTo("#posts"); 

Antwort

1

Das Problem

Der Grund, warum Ihr Teil wird alle neue Beiträge zu machen ist, weil Sie das Instanzvariable@post anstelle des lokal Variablepost in Ihrem Teil verwenden. In Ihrer UsersController#show Aktion setzen Sie @post = @user.posts.build. Wenn Sie innerhalb des Partials <%= @post.id %> rendern, verweisen Sie auf dieselbe Variable, die vom Controller stammt und auf einen neuen Post gesetzt wurde.

Es scheint, dass alle zuvor erstellten Beiträge aus „null'ed“ werden, aber es ist wirklich nur, dass man kontinuierlich einen neuen Beitrag rendern, nicht die bestehenden.

Die Lösung

Sie benötigen teilweise zu aktualisieren, eine lokale Variable zu verwenden, nicht die Instanzvariable.

<li><%= post.id %></li> 

Diese lokale Variable wird durch Rails Ihnen automatisch zur Verfügung gestellt, wenn Sie dies in der Zukunft vermeiden

<%= render @user.posts %> 

oder alternativ

<%= render partial: "posts/post", collection: @user.posts %> 

Wie eine Sammlung von Datensätzen wie machen

Dies ist ein wirklich häufig Fehler und kann leicht zu übersehen sein.

Aus diesem Grund ist meine Empfehlung stop using instance variables in partials insgesamt.

Ressourcen

+0

Vielen Dank für die Antwort, ich werde es zu einer Regel machen, um Instanzvariablen in Teiltönen zu vermeiden – Laurence

0

Ja, sind Sie richtig.

create.js.erb mit dem Suffix erb, um Ihnen zu helfen, Code Ruby hinzuzufügen.

nehmen Code in dieser Datei das gleiche mit Ihnen schreiben Javascript-Code zu sehen html.erb mit Syntax

<script> 
    $("<%= escape_javascript(render @post) %>").appendTo("#posts"); 
</script> 
+0

danke für die Antwort, tun Sie verstehen, warum meine Liste der Beiträge aller Post.new werden die Seite auf erfrischend? – Laurence

+0

auf posts_controller/index Was bedeutet ** @ post = Post.new ** bedeutet? –

+0

Ich habe das gelöscht, da es ein Fehler war, aber die User-Show-Ansicht zeigt immer noch jeden Beitrag als Post.new an, anstelle von separaten Posts – Laurence

1

eine Abhilfe gefunden durch die Verwendung der _POST Vermeidung Teil die älteren Beiträge anzuzeigen:

bearbeiten : Benutzer/show.html.erb

<ul id="posts"> 
    <% @posts.each do |post| %> 
    <li> 
     <%= post.id %> 
    </li> 
    <% end %> 
</ul> 

ich glaube nicht, dass dies eine ideale Lösung ist, aber es funktioniert jetzt in Ordnung.

Verwandte Themen