如何使关系工作在路由,控制器,视图?has_many belongs_to



我正在努力让我的关系在轨道工作。

我有一个用户,画廊,评论模型

class Gallery  
  has_many :comments
  belongs_to :user
end
class User  
  has_many :comments
  has_many :galleries
end
class Comment
  belongs_to :gallery
  belongs_to :user
end

现在我应该在路由,控制器和视图中做些什么来把这些链接起来呢?请帮帮我?要找出答案是相当令人困惑的。如果可以,我不希望它像在railscast一样嵌套,但我希望每个模型,例如gallery我可以输入用户,例如comment我可以找到并输入galleryid和userid。

我现在完全被遗忘了,不知道该做什么。请给予一些帮助。谢谢。

这是一个复杂的主题,不能简单地告诉你怎么做,但我会试着帮一点忙。Zippie的建议很好,你应该通过一个教程来学习不同类型的关系。

在您的数据库中,您将需要:

create_table :gallery do |t|
  t.user_id
end
create_table :comments do |t|
  t.gallery_id
  t.user_id
end

这些是Rails将用来匹配模型的外部索引(外部索引在指定belongs_to关系的模型中)。

至于你的路由,没有单一的解决方案,但你可能想要嵌套它们,这样你就可以做/users/comments或/galleries/comments:
resource :users do
   resource :comments
end
resource :galleries do
   resource :comments
end

你也可以简单地把它们分开:

resources :users, :galleries, :comments

在你的控制器中,当你创建一个新对象时,你应该从它所属的对象开始:

@comment = current_user.comments.build(params[:comment])

这将设置评论的user_id为当前用户,例如。

在视图中,没有太大的区别,只是在控制器中获取@comments变量,像这样:

@comments = @gallery.comments

并在视图中使用。

当您想要定义一个表单帮助器来创建一个新注释时,它可能不太直观,例如:

<%= form_for([@gallery, @comment]) do |f| %>
  ...
<% end %>

我希望这能帮助你开始。

最新更新