這是我在這裏的第一篇文章,說實話,我並不傾向於提出很多問題,但是在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_items
(class 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的新手。感謝您給予的任何幫助。
謝謝您的及時回覆。我很抱歉,我應該可能已經指定我正在使用Ajax表單。我編輯了我原來的帖子。 –
我還沒有讀完整篇文章,我只是想提一下,表單完全沒有問題,他的回答仍然有效。 – Robin
是的,我的不好。沒有必要包括這一點。我想說的是「在這裏,讓我給你看看我的表格」。哈哈,當時沒有包括表格。 :P那是我的錯。 –