Ruby:在一个帖子中保存两个模型

时间:2013-11-22 10:27:07

标签: ruby-on-rails ruby

我是Rails的新手,来自.NET,实际上这是我工作的第一个Ruby项目,所以我还在研究如何处理事情。

我将从我的问题的结构开始:我有一个项目表和一个图像表。还有一个 ProjectImage 表,您猜测它有一个project_id和一个image_id。作为用户,当我创建项目时,在新/编辑视图中,我希望能够选择我想要上传的任何图像(我想强制执行至少一个图像,但也许这是另一个问题)。

我想这是可能的,因为在.NET中做起来相当简单,我只需要一个代表Project ViewModel ,至少一个需要image_id。但是,我对Rails的理解还不足以在Rails中看到方法的直接复制。

我环顾四周,根据我的理解,我可能没有以正确的方式接近这一点,所以我的问题是,这是否可能,我是否正确接近它,如果是这样,Rails的传统方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以这样设置表单

<%= form_for :project, :html=> {:multipart=>true} do |f| %>
  <%= f.text_field :title %>
  <%= file_field_tag :images, :multiple => true, :name => 'images[]' %>
  <%= f.submit %>
<% end %>

然后在你的控制器中,你的项目属性在params[:project](在这种情况下只是一个标题),而params[:images]将是一组上传的图像。

当然有一些好的宝石用于此目的,如carrierwavepaperclip,但正如你所说,你的理解还不够,我想你可能想在你之前掌握它开始走捷径。

对于 ProjectImage 表,如果您不需要存储在关系本身中的其他信息,则应该将project_id列添加到images表中,然后让图像{{1}和项目belong_to :project

答案 1 :(得分:1)

欢迎来到Rails的世界,从一个新手到另一个。

我建议看一下载波。我发现将图像上传到我的模型非常有用。它还可以使用imagemagick来确保您的用户不会将图片上传到大图,并且还可以进行大量验证以确保您的数据库不会过载。

你可以在这里找到github,随时问你是否有任何问题:

https://github.com/carrierwaveuploader/carrierwave

还有一个较旧的宝石,很多人都可以使用,你可以在这里找到:

https://github.com/thoughtbot/paperclip

还不确定您是否需要一个项目表,因为您只需要在项目表中添加一列,图像将作为文件路径的哈希值存储在那里,并由项目或用户引用。

您可以在此处查看有关carrierwave的railscast:

http://railscasts.com/episodes/253-carrierwave-file-uploads