比如我有个 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 这两个值?新手求教。
#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.
@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*/
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
#12 楼 @mingyuan0715 持久化就是保存数据。保存到一个固定的地方。 可以是关系数据库,nosql,文件,总之是一个下回可以读出来的地方。