2011-01-09 13 views
1

Ich habe lernen Rails gerade erst begonnen und ich versuche, einen Beitrag/wie Typ-Funktion zu bauen. Ich habe es funktioniert, aber es muss einen effizienteren Weg geben, es zu tun.Rails 3 - Optimieren form_for in Index und zeigt Ansichten

Mein Postindex Ansicht enthält den folgenden Code (I jQuery bin mit der Form über Ajax einreichen):

<% @posts.each do |post| %> 
    <%= form_for([post, post.likes.build]) do |f| %> 
    <%= f.hidden_field :user_id, :value => current_user.id %> 
    <%= f.hidden_field :post_id, :value => post.id %> 
    <%= f.submit pluralize(post.likes.count, 'Like'), :class => 'like like-' + post.id.to_s %> 
    <% end %> 
<% end %> 

Meine Show Ansicht enthält folgende Komponenten:

<%= render "likes/form" %> 

Welche enthält die folgende:

<%= form_for([@post, @post.likes.build]) do |f| %> 
<%= f.hidden_field :user_id, :value => current_user.id %> 
<%= f.hidden_field :post_id, :value => @post.id %> 
<%= f.submit pluralize(@post.likes.count, 'Like'), :class => 'like like-' + @post.id.to_s %> 
<% end %> 

Das alles funktioniert mit jQuery kombiniert und Links zerstören. Zwei unterschiedliche Formen zu haben, scheint allerdings etwas schwer zu sein. Irgendwelche Ideen zur Veränderung/Optimierung oder den besten Weg dies zu tun?

Danke.

+1

Warum sind vorbei Sie 'post_id' als hidden_field? Es wird durch deinetwegen automatisch weitergeleitet werden, um eine verschachtelte Formular ('[@post, @ post.likes.build]') –

+0

Hey Ryan, ich versteckte Felder nicht mehr vorbei, gereinigt es ein gutes Stück mit Hilfe up von @mark und @pjammer. – Goldy

Antwort

2

bearbeiten form.html.erb Ihr Formular teilweise

<%= form_for([post, post.likes.build]) do |f| %> 
    <%= f.hidden_field :user_id, :value => current_user.id %> 
    <%= f.hidden_field :post_id, :value => post.id %> 
    <%= f.submit pluralize(post.likes.count, 'Like'), :class => 'like like-' + post.id.to_s %> 
<% end %> 

<%= render "likes/form", :locals => {:post => @post} %> 

<% @posts.each do |post| %> 
    <%= render "likes/form", :locals => {:post => post} %> 
+0

Ich stimme dem versteckten Feld current_user field point zu, das von pjammer erstellt wurde, da dies für Missbrauch offen wäre. form_for ([post ... wird bereits die Post-ID als Teil der Aktion erstellen (Formularroute), so dass Sie diese auch entfernen können. – mark

+0

Danke, sehr hilfreich. Ich räumte die versteckten Felder auf und probierte das oben ... aber ich erhalte eine „nicht definiert lokale Variable oder Methode‚post‘, ich bin zu raten ich etwas in der Steuerung ändern müssen? – Goldy

+0

Wo ist der Fehler auftritt? – mark

1

versteckte Felder sind für noobs Mann, bringe diese Unordnung in der Steuerung :-)

in Ihrem Post-Controller etwas tun, wie


def show 
    @post = Post.find(params[:id]) 
    @like = @post.likes.build 
end 
def create 
    @like = @post.likes.build(params[:id]) 
    @like.user_id = current_user.id 
    # ... the rest of the stuff here 
    #assuming you have scaffolded it will be here. you can find that 
end 

jetzt in der Ansicht Sie so etwas wie tun: < % = form_for([post, @like]) do |f| %> < % = render_partial 'likes', :locals => {:f => f} %> < % end %>

in einem neuen _likes.html.erb: < % = f.submit pluralize(post.likes.count, 'Like') , :c lass = > 'like like-' + post.id.to_s %>

natürlich können einige nicht genau funktionieren, aber das ist der Kern von dem, was ich sammeln kann.

+0

dank @pjammer alle aufgeräumt, für das nächste Mal wissen jetzt:) ... versucht, in der oben in der Post setzen Controller erstellen ... aber wenn ich einen Beitrag erstellt er baute auch dergleichen. Ich muss nur ein wenig mehr herumspielen, denke ich. – Goldy

+0

Sie könnten auch tun @Like = @ post.likes.build (params [: wie] .merge {: user_id => current_user.id}) – mark

+0

Ich denke, man sollte meinen Code in den Like-Controller setzen ... ich dachte darüber, aber wusste nicht das Ausmaß dessen, was Sie taten. Probieren Sie es aus und wenn es funktioniert, werde ich diese Antwort aktualisieren. – pjammer

Verwandte Themen