2013-02-10 54 views
3

這可能是一個錯誤,因爲我對Rails的最少理解以及如何在模型中使用變量,所以如果需要更多的代碼來回答它或者我的術語不正確,讓我知道,我會很樂意更新這個問題。傳遞一個實例變量到一個表格 - rails

我有一個帖子,我想讓用戶能夠「喜歡」。儘管以下代碼允許喜歡在單個帖子的頁面上工作 - site.com:3000/posts/*post.id* - 表單數據通過like[liked_post_id]:*post.id*傳遞,當我嘗試在配置文件中提交類似內容時 - site.com:3000/users/*user.id* - 其中包含帖子提要,表單數據被傳遞是like[liked_post_id]:(空白值)

如何將帖子內的帖子ID傳遞給liked_post_id變量_like.html.erb

我注意到,相同形式的行爲是/likes。如果您在頁面site.com:3000/posts/*post.id*上,這隻會起作用嗎?我很好奇,如果我需要,當你在網頁site.com:3000/users/*user.id*

從我的崗位以修改它,這樣形式的作用是/posts/*post.id*/likes

#views/posts/_post.html.erb: 
... 
    <%= render 'posts/like_form' if signed_in? %> 
... 

路線,以適當的形式:

#views/posts/_like_form.html.erb: 
    <div id="like_form"> 
    <% if current_user.likes_this?(@post) %> 
    <%= render "posts/unlike" %> 
    <% else %> 
    <%= render "posts/like" %> 
    <% end %> 
    </div> 

像:

#views/posts/_like.html.erb 
    <%= form_for Like.new, :remote => true do |f| %> 
    <%= f.hidden_field :liked_post_id, :value => @post.id %> 
    <%= f.submit "Like" %> 
    <% end %> 

從型材(飼料帖子):

#views/users/show.html.erb 
... 
    <%= render @posts %> 
... 

喜歡控制器:

#controllers/likes_controller.rb  
    class LikesController < ApplicationController 
    before_filter :signed_in_user 

    def create 
    @post = Post.find(params[:like][:liked_post_id]) 
    current_user.like!(@post) 
    respond_to do |format| 
     format.html { redirect_to root_url } 
     format.js 
    end 
    end 
... 

用戶模式:

#models/user.rb 
... 
    def like!(post) 
    likes.create!(liked_post_id: post.id) 
    end 
... 

@弗蘭克 - 暴雪已經指出,我的形式標記是一個問題。在帖子的頁面生成的標記是:

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" value="73" /> 

雖然飼料頁:

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" /> 
+0

來調試您的視圖_likes_的創建應該在控制器中完成。 – 2013-02-11 01:16:56

+0

@代碼源,請參閱上面的「編輯1:」,_like_正在類似的控制器中創建。 – 2013-02-13 16:32:29

回答

8

你可以做這樣的事情:

<% form_for Like.new, :remote => true do |f| %> 
<%= f.hidden_field :post_id, :value => @post.id %> 
<%= f.submit %> 
<% end %> 

current_user.likes.build(...)部分應該走出你的觀點和你的控制器裏面。你正在使用current_user.like!方法,所以我猜你已經在用戶模型中實現了一些方法來實現這一點。如果你不喜歡在你可以訪問params[:like]的LikesController的create動作中構建你的喜歡。

def create 
    @post = Post.find(params[:like][:post_id]) 
    current_user.likes.build(@post) 
    # ... 
    end 

編輯

您可能需要正確地傳遞你的@post變量到您的_like_form諧音,象這樣:

#views/posts/_post.html.erb: 
... 
<% if signed_in? %> 
    <%= render 'posts/like_form', :post => @post %> 
<% end %> 
... 

這會給你存取要求裏面的一個post變量部分,所以你可以預先填充你的表格值與它的ID。請參閱此問題以及Pass a variable into a partial, rails 3?並確保閱讀如何正確地將變量傳遞給部分。您可以使用<%= debug <variablename> %>

+0

感謝您指出我遵循Ruby最佳實踐和構建喜歡的位置的一些問題。這些是我在學習鐵軌時很難跟上的主題。我已用「編輯2」更新了我的問題,以包含我的喜歡!方法。 不幸的是,我仍然只能在單個帖子的頁面上提交一個類似的內容,而在包含帖子提要的配置文件中,空白值會以「like [liked_post_id]」的形式發送數據「 – 2013-02-13 16:41:40

+1

看起來像您不要將post變量正確地傳遞給_like_form或_like。嘗試使用<%= debug @post%>檢查post變量。還要檢查您的表單標記,如果您的隱藏字段中存在真正的值。 – tmaximini 2013-02-13 17:46:08

+0

表單標記是我確切的問題。 在帖子的頁面上:'' 在feed頁面:'' 我在哪裏可以更正帖子變量? – 2013-02-13 17:57:58

相關問題