看了很多关于 Rails 中社交链接系统的教程。我注意到似乎一直使用朋友作为用户对象的别名,并使用连接模型“友谊”。
起初我遵循了这一点,但随着我的前进,它似乎使事情变得create.friend
非常迟钝。现在在我的示例中,我使用术语“联系人”和“连接”......当我列出所有用户的联系人时,我希望通过联系人控制器和视图( /contacts , /contacts/搜索、/contacts/create 等),但所有的杂乱无章都真正处理了连接(友谊)表……当我走的时候,这似乎真的倒退了。
为什么这样做?我看到的唯一好处是可以说“contact.email”之类的东西,但我不确定我的代码中的额外抽象和体操是否值得。我很乐意说contact.user.email.
链接到联系人页面? link_to contact.user
(对?)
如果我只有一个具有标准、明显、粗略结构的模型“联系人”并放弃用户模型的这种别名,是否有任何犯规?坦率地说,除了身份验证之外,我根本看不到弄乱用户模型有什么好处……我将用户的所有信息都放在了个人资料中。
还是我错过了什么?
更新:我似乎不清楚,所以我会详细说明。
计划A:
def contact
belongs_to :user
belongs_to :connection, :class_name => 'User', :foreign_key =>'contact_id'
validates_uniqueness_of :contact_id, :scope => :user_id, :message => ' allready one of your contacts.'
attr_accessor :invite
end
然后为此使用正常的 CRUD。转到我的“联系人”页面将显示我所有具有正常 crud 操作的联系人等...要获取联系人的电子邮件,在这种情况下,我会说:contact.connection.email
然后我做了一些阅读,发现其他人都在这样做:
class Connection < ActiveRecord::Base
belongs_to :user
belongs_to :contact, :class_name => 'User', :foreign_key =>'contact_id'
validates_presence_of :user_id
validates_presence_of :contact_id
validates_uniqueness_of :contact_id, :scope => :user_id, :message => ' allready one of your contacts.'
attr_accessor :invite
end
但随后使用联系人控制器(朋友控制器)在这里交出杂物。唯一的好处似乎是你可以说contact.email ......但它使联系人控制器中的所有垃圾都变得奇怪恕我直言。例如:
http://railsforum.com/viewtopic.php?id=16760
我想知道为什么明显的断开连接?
更新 2:
所以我明白了......联系人必须是对用户模型的引用......没有解决这个问题。3 步骤,无论在那种情况下。但是,当我尝试沿着这条路径执行时,我仍然对一些要点感到困惑:
使用带有这样的代码的 contacts_controller.rb 是否违反 mvc:
# in contacts_controller.rb
def destroy
@connection = Connection.find(params[:id])
@connection.destroy
respond_to do |format|
format.html { redirect_to :action=>'index' }
format.xml { head :ok }
end
end
然后,当我尝试执行 form_for @connection、路由错误等等时,它变得很奇怪。我知道我正在解决这个问题,并且非常感谢迄今为止的所有反馈。
更新 3:
这里举例说明了我对这些关系感到困惑的一个实际例子:
<% @contacts.each do |contact| %>
<li><%= contact.email %> <%= link_to 'Remove Contact', contact.connection, :confirm => 'Are you sure?', :method => :delete %></li>
<% end %>
在遍历用户的联系人时,如何巧妙地调用在列表中显示此联系人以删除目标的连接?也许我应该只是遍历用户的连接,拉出 connection.contact.email 来显示电子邮件?