0

在应用程序中,用户可以输入包含标题、帖子内容和帖子类别的新帖子。因此,创建新帖子将通过一些带有少量字段的简单 html 表单。现在我不知道在哪里放置创建新帖子的逻辑,原因如下:

例如,帖子(或帖子集合)是由不同表构造的对象。

@posts = User.joins(entries: [{storage: :vote}, :category]) 
             .where("votes.count > ?", 0)
             .select("users.username AS username,
                      storages.id AS storage_id,
                      storages.title AS title, 
                      storages.content AS content, 
                      votes.count AS votes, 
                      categories.category_name AS category_name")
             .order("votes.count DESC")

因此,当用户创建新的帖子应用程序时,必须在不同的表中创建新条目:

1.在条目表中创建新条目。2. 在storages(id, user_id, category_id)
中创建新条目。3. 在投票表 中创建新条目。(id, title, content, entry_id)
(id, count, storage_id)

帖子resources: posts是模型的情况下,我可以在帖子控制器中使用类似的东西newcreate我可以创建新帖子,但是在我不需要帖子控制器或帖子模型的这种情况下呢?所以,问题是:哪个地方更适合放置创建新帖子的逻辑?第一季度

我的解决方案是创建存储控制器,resource: storages, :only => [:new, :create]然后通过新建和创建此控制器来填充数据库中的不同表?我在这里强迫only是因为我在这里看不到任何其他 CRUD 操作(例如显示全部或一个存储),因为我不会单独使用存储,而是与其他表一起使用。那么从视图/存储到 new.html.erb 和 create.html.erb 我可以构建新帖子吗?第二季度

另一种解决方案是创建没有我之前所说的“相应”帖子模型的 Post 控制器。在这里我猜我不能使用宁静的路线(CRUD),因为没有:id帖子?我只能手动制作非静态路由,例如:然后
post 'posts/create/:title/:content/:category' => 'posts#create', :as => 'create_post' fromparams[:title]和填充其他表。第三季度params[:content]params[:category]

我是 Rails 新手,所以请不要大喊大叫:D

4

2 回答 2

1

这听起来像是对嵌套表单的呼吁,它被覆盖在 这里的屏幕截图中。

您使用顶级模型的资源,在本例中为 Entry。并深入到第 3 个模型。

下面是简单的操作示例。模型应该是这样的,

入口.rb

class Entry < ActiveRecord::Base
  has_many :storages, :dependent => :destroy
  accepts_nested_attributes_for :storages, :allow_destroy => true
end

存储.rb

class Storage < ActiveRecord::Base

  belongs_to :entry
  has_many :votes, :dependent => :destroy
  accepts_nested_attributes_for :votes, :allow_destroy => true
end

投票.rb

class Vote < ActiveRecord::Base
  belongs_to :storage
end

表格应该是这样的,simple_form 风格

<%= simple_form_for @entry do |f| %>

  <%= f.simple_fields_for :storages do |storage_fields| %>
    <%= storage_fields_for :votes do |vote_fields| %>

    <% end %> 
  <% end %>
<% end %>

如果你已经设置了所有模型,你不应该对控制器做任何事情。

这种方法也很好,因为如果需要,您可以添加多个存储和投票 ajax 样式(无需重新加载页面),这总是很好。

于 2013-11-06T00:54:23.083 回答
0

我每天都会使用表单类而不是嵌套属性,请参阅http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/示例这种模式(第“3. 提取表单对象”)

我经常使用该模式来对其进行宝石化https://github.com/bbozo/simple_form_class并且大致以这种方式使用:https ://gist.github.com/bbozo/5036937 ,如果您有兴趣使用它我会推送一些文档

编辑:我大部分时间都倾向于采用表单类路线的原因是因为嵌套属性最终永远不会咬我,要么是因为强大的参数处理变得麻烦,要么验证器变得太复杂(如果坚持?否则...... ),或者需要扩展持久性逻辑以支持一些解决回调地狱或模型中递归保存的小诀窍(保存意大利面条麻烦之前/之后)

于 2013-11-12T09:20:34.997 回答