1

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

所以重申我的故意问题:当它位于定义为的分页列表中时,我将如何“成功”class Opinion在成员的 UNIQUE 共享 ( ) 内呈现一个赞按钮(带有 )。class Thought@share_items

抱歉,如果我感到困惑,这是第一次在这里发帖,我是 Ruby 新手。感谢您提供的任何帮助。

4

2 回答 2

0

当你有嵌套对象时,你应该像这样声明你的表单:

form_for [@member, @opinion]
于 2012-10-05T22:35:23.057 回答
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 %>

<%= @thought.id %>我可以从 js 中省略,所以它看起来像("#like_form")

正如我所说,这使我不得不在其中添加代码而不是渲染表单部分,但如果我这样做,我会收到错误“share_item 是未知或未定义的局部变量”虽然我已经完成了我最初的目标是让表单真正工作,我仍在寻求有关如何呈现表单而不是直接将其添加到我的部分的建议,而不会收到该错误消息。

于 2012-10-06T20:17:29.383 回答