这是我在这里的第一篇文章,老实说,我不会问太多问题,但是在 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 做了一些可疑的事情......我试图告诉 like 表单以针对特定的想法(成员的分享)。注意:这是迄今为止最成功的一次,但没有雪茄。它将 fan_id (member) 和 like_id (thought) 添加到数据库中并呈现不同的按钮。但它有意想不到的结果。例如: 有时,无论我喜欢哪个成员的分享,它总是会呈现与页面的第一个分享不同的效果,尽管它会将正确的数据添加到数据库中。其他时候它会正常工作,但在刷新页面后,它会呈现点赞按钮(即使它当前是被点赞的),或者会呈现正确的按钮,但在尝试“取消赞”共享时会引发错误说没有匹配到“破坏/意见”
所以重申我的故意问题:当它位于定义为的分页列表中时,我将如何“成功”class Opinion
在成员的 UNIQUE 共享 ( ) 内呈现一个赞按钮(带有 )。class Thought
@share_items
抱歉,如果我感到困惑,这是第一次在这里发帖,我是 Ruby 新手。感谢您提供的任何帮助。