我有一个自我加入对象“事物”
class Thing < ActiveRecord::Base
has_many :children, :class_name => "Thing", :foreign_key => "parent_id"
belongs_to :parent, :class_name => "Thing"
end
当我查看Thing时,我想提供一个指向新事物页面的链接来创建一个子对象,其中parent_id填充了当前Thing的id,所以我想我会用这个
<%= link_to 'New child thing', new_thing_path(@thing) %>
但是这不起作用,因为默认操作是控制器中的GET方法,它无法在参数中找到:id
@thing = Thing.find(params[:id])
所以问题是;
a)我是否应该为儿童设置新的控制器;或 b)有没有更好的方法将parent_id的参数发送到Thing控制器中的GET方法
提前致谢
思。
答案 0 :(得分:4)
您不必为此目的创建新的Controller。您也可以使用现有Controller中的一些其他路径和操作来执行此操作。如果您已将Thing控制器映射为资源,则可以添加其他路径:
map.resources :things, :member => { :new_child => :get, :create_child => :post }
将为您提供另外两条路线:
new_child_thing GET /things/:id/new_child(.:format)
create_child_thing POST /things/:id/create_child(.:format)
然后,您可以将这两个操作添加到控制器并处理其中的创建
def new_child
@parent_thing = Thing.find(params[:thing_id])
@thing = Thing.new
...
end
def create_child
@parent_thing = Thing.find(params[:thing_id])
@thing = Thing.new(params[:thing])
@thing.parent = @parent_thing
if @thing.save
render :action => :show
else
render :action => :new_child
end
end
答案 1 :(得分:0)
new_thing_path(:parent_id => @thing.id)
在新动作中:
parent = Thing.find params[:parent_id]
答案 2 :(得分:0)
<%= link_to 'New linked thing', new_thing_path(:Parent_id=>@thing.id) %>
并在控制器中
def new
@parent = Thing.find(params[:Parent_id])
@thing = Thing.new
@thing.parent_id = @parent.id
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @organizr }
end
end
我想我的真正问题应该是如何在Rails中为GET添加参数!