Ruby on Rails - 如何在路由、控制器和视图中实现关系?has_many,belongs_to。

5

我正在努力让我的Rails关系正常工作。

我有一个用户(User)、画廊(Gallery)和评论(Comment)模型。

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,我可以输入用户,例如评论,我可以查找并输入galleryid和userid。

我现在完全迷失了方向,不知道该做什么。请给予一些帮助。谢谢。


2
尝试通过这个教程:http://ruby.railstutorial.org/ruby-on-rails-tutorial-book - Zippie
1个回答

8

这是一个复杂的主题,不能简单地告诉你如何做,但我会尽力帮助一下。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])

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

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

@comments = @gallery.comments

并在您的视图中使用它。

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

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

我希望这能帮助你入门。

非常感谢,这与我在这里遵循的内容相似:http://railscasts.com/episodes/238-mongoid?view=asciicast,现在您至少已经阐明了路由,我需要弄清楚如何处理控制器和视图。我还需要再多学习一些。 - Axil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接