1

這是我在這裏的第一篇文章,說實話,我並不傾向於提出很多問題,但是在Ruby on Rails中嵌套相當一段時間的事情讓我感到惱火。對Ruby on Rails嵌套感到沮喪

我有一個class Thought(這是會員的個人帖子),分頁爲@share_items。我包含一個類似的按鈕,可以讓成員喜歡其他成員的帖子(如Facebook)。類似按鈕有class Opinion

我的代碼迄今:

Class Member 
has_many :thoughts, dependent: :destroy 
has_many :opinions, foreign_key: "fan_id", dependent: :destroy 
has_many :fans, through: :opinions 

Class Thought 
belongs_to :member 

has_many :opinions, foreign_key: "like_id", dependent: :destroy 
has_many :likes, through: :opinions 

validates :member_id, presence: true 

Class Opinion 
attr_accessible :like_id 

belongs_to :fan, class_name: "Member" 
belongs_to :like, class_name: "Thought" 

validates :fan_id, presence: true 
validates :like_id, presence: true 

Member Model 
def share 
Thought.from_members_authenticated(self) 
end 

MemberPages Controller 
def homepage 
@share_items = registered_member.share.paginate(page: params[:page]) 
end 

部分_share.html.erb

<% if @share_items.any? %> 
<ol class="member_shares"> 
<%= render 'shared/share_item', collection: @share_items %> 
</ol> 
<%= will_paginate @share_items %> 
<% end %> 

這使得部分_share_item.html.erb

<li id="<%= share_item.id %>"> 
content... 
<%= render 'thoughts/like_form' %> 
...content 
</li> 

一切順利,直到我試圖使裏面的形式thoughts/like_form分頁@share_itemsclass Thought)。它有奇怪和無法解釋的結果(對我來說)。以下是導致表格的代碼。

Member Model 

def liked?(random_thought) 
opinions.find_by_like_id(random_thought.id) 
end 

def like!(random_thought) 
opinions.create!(like_id: random_thought.id) 
end 

def unlike!(random_thought) 
opinions.find_by_like_id(random_thought.id).destroy 
end 

OpinionsController 

respond_to :html, :js 

def create 
@thought = Thought.find(params[:opinion][:like_id]) 
registered_member.like!(@thought) 
respond_with @thought 
end 

def destroy 
@thought = Opinion.find(params[:id]).like 
registered_member.unlike!(@thought) 
respond_with @thought 
end 
end 

最後形式thoughts/like_form

<div id="like_form"> 
<% if registered_member.liked?(@thought) %> 
<%= render 'thoughts/unlike' %> 
<% else %> 
<%= render 'thoughts/like' %> 
<% end %> 
</div> 

這會使要麼thoughts/unlike

<%= form_for(registered_member.opinions.find_by_like_id(@thought), 
html: { method: :delete }, 
remote: true) do |f| %> 
<%= f.submit "Unlike", class: "btn btn-small btn-default" %> 
<% end %> 

或:thoughts/like

<%= form_for(registered_member.opinions.build(like_id: @thought.id), 
remote: true) do |f| %> 
<div><%= f.hidden_field :like_id %></div> 
<%= f.submit "Like", class: "btn btn-small btn-primary" %> 
<% end %> 

結論與opinions/create.js.erb

$("#like_form<%= @thought.id %>").html("<%= escape_javascript(render('shared/unlike')) %>") 
$("#likes").html('<%= @thought.likes.count %>') 

opinions/destroy.js.erb

$("#like_form<%= @thought.id %>").html("<%= escape_javascript(render('shared/like')) %>") 
$("#likes").html('<%= @thought.likes.count %>') 

通知我做了什麼腥的JS ......我試着告訴等等形式,以針對特定的思想(成員的份額)。注意:迄今爲止這是最成功的,但沒有雪茄。它將fan_id(member)和like_id(思想)添加到數據庫並呈現不同按鈕。但它有不可預測的結果。例如:有時候,無論我喜歡哪個成員的股份,它總是會呈現不同於頁面的第一份,雖然它會將正確的數據添加到數據庫中。其他時候它會正常工作,但刷新頁面後,它會呈現類似按鈕(即使它當前被喜歡),或者它會呈現正確的按鈕,但在嘗試「不像」共享時會引發錯誤表示不存在與「銷燬/意見」相匹配的表示不針對特定股份的情況。

因此,要重申我的我的故意的問題:如何將我「成功」使成員的獨特份額(class Thought)時,它被定義爲@share_items一個分頁列表內內像按鈕(帶有class Opinion)。

對不起,如果我很困惑,第一次發佈在這裏,我是Ruby的新手。感謝您給予的任何幫助。

回答

0

我已經找到了一種方法,成功使類似/不同形式成員的個別文章。雖然這是不可思議的,但空間消耗最重要:缺乏趨勢;它確實工作。

不用翻譯like_form.html.erb的,我直接添加的代碼share_item.html.erb並告訴形式不找@thought而是尋找share_item(這是@share_items嵌套class Thought集合中的單個項目)

thoughts/unlike.html.erb現在看起來像:

<%= form_for(registered_member.opinions.find_by_like_id(share_item), 
html: { method: :delete }, 
remote: true) do |f| %> 
<%= f.submit "Unlike", class: "btn btn-small btn-default" %> 
<% end %> 

thoughts/like.html.erb

<%= form_for(registered_member.opinions.build(like_id: share_item.id), 
remote: true) do |f| %> 
<div><%= f.hidden_field :like_id %></div> 
<%= f.submit "Like", class: "btn btn-small btn-primary" %> 
<% end %> 

,我可以忽略從JS <%= @thought.id %>所以它看起來像("#like_form")

正如我所說的,這側畔了我的部分無需添加代碼在它的內部,而不是渲染的形式部分,但如果我做後者,我得到的錯誤是「share_item是一個未知或未定義的局部變量」雖然我已經完成了我的初始目標,讓表單實際工作,但我仍然在尋求關於如何呈現表單而不是直接將其添加到我的部分,沒有得到那個錯誤消息。

0

當你嵌套對象,你應該申報的形式是這樣的:

form_for [@member, @opinion] 
+0

謝謝您的及時回覆。我很抱歉,我應該可能已經指定我正在使用Ajax表單。我編輯了我原來的帖子。 –

+0

我還沒有讀完整篇文章,我只是想提一下,表單完全沒有問題,他的回答仍然有效。 – Robin

+0

是的,我的不好。沒有必要包括這一點。我想說的是「在這裏,讓我給你看看我的表格」。哈哈,當時沒有包括表格。 :P那是我的錯。 –