Rails 多态关联中子对象创建时 controller#create 怎么写?

lying325 · 2012年05月22日 · 最后由 woaigithub 回复于 2013年05月31日 · 3745 次阅读

比如我有个 topic belongs_to :topicable, polymorphic: true 然后也有个 node has_many :topics, as: :topicable 在/nodes/1/new_topic 下 render 'topics/form'

问题是 form 里没有 topicable 项的情况下,怎么让 create 知道关联的 topicable 是 node? 也就是说怎么获取 nodes 和 1 这两个值?新手求教。

我的毕设正用 rails 写呢,遇到上面这个问题,还请大家帮助下,谢谢啦

可以用 inherited_resources

#2 楼 @ShiningRay 谢谢啦 我想这个情况并没有那么复杂,只是我不会。 我在 nodes#new_topic 里 render 了 'topics/form',在那个表单里只有 title 和 body 两项 而在 create topic 的时候一个是需要 current_user.id,一个是 topicable_type 和 topicable_id 我就是想获取 /nodes/1/new_topic 中的 nodes 和 1 这两个值。 自己想的一个方法是把 /nodes/1/new_topic 这个 path 保存到 session 中,一个是不使用 topics#create 这个方法,不过实现不是很优雅。我初学 rails 不知道怎么弄?

route 设置好,用最直接的方法。 @node = Node.find(params[:id]) @topic = @node.topics.create(params[:topic])

看看 rails api 中 has_many 的部分 里面提到使用 has_many 关联之后,会给 model 增加一些方法 你需要的应该是这个吧

collection.build(attributes = {}, …) Returns one or more new objects of the collection type that have been instantiated with attributes and linked to this object through a foreign key, but have not yet been saved.

#5 楼 @AshZ 谢谢啦 但不止 nodes 有 topics 哦,还有 /courses/1/new_topic 和 /events/1/new_topic,它们都使用 topics#create 方法,我不知怎么让 create 知道是哪一个。。 你的意思是在路由里建一个 sub-resources 来创建一个 topic 吗?

#6 楼 @edokeh 谢谢啦 我知道在 topics#create 里用 current_user.topics.build(topicable_id: node.id, topicable_type: 'Node', title: ...) 但是我不知道怎么获取 topicable_type 的值,因为它也可能是 'Course' 或者‘Event'.

@lying325 那 route 这样设置吧 post '/:topic_owner/:id/new_topic' => 'topics#create' 这样在 Controller 里就能通过 params[:topic_owner] 和 params[:id] 获得了 @topic_owner = params[:topic_owner].classify.find(params[:id]) @topic = @topic_owner.topics.create(params[:topic]) 不过这样的设置要注意调整 route 的顺序,不然可能会覆盖一些其它 routes 也可以在刚才创建的 route 后加入正则 :topic_owner => /(TOPIC_OWNER_LISTS)/, :id => /[1-9]\d*/

#9 楼 @AshZ 谢谢,你说的意思我明白了

class Node < ActiveRecord::Base has_many :topics end

class Topic < ActiveRecord::Base belongs_to :node end

@node=Node.find(params[:id]) @topic=@node.topics.build(:title=>"title", :content => "content") #只创建 node 的 topic,不做持久化 @topic.save\

@topic=@node.topics.create(:title => "title", :content => "content")#持久化 topic

#11 楼 @woaigithub 楼上能解释下什么事持久化么,不是很懂这个概念,谢谢了。

#12 楼 @mingyuan0715 持久化就是保存数据。保存到一个固定的地方。 可以是关系数据库,nosql,文件,总之是一个下回可以读出来的地方。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号