在我的控制器中使用参数

时间:2009-11-02 08:59:03

标签: ruby-on-rails controller

所以我使用优秀的Ancestry gem但是虽然文档看起来非常完整,但我不明白如何传递我想要成为新创建元素的父元素的参数。首先,我想在newcreate行动中执行此操作...请允许我解释一下。例如:(为简洁起见,删除了一些操作)

class PeopleController < ApplicationController

  #...

  def new
    @person = Person.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:notice] = "Registration Successful."
      redirect_to root_url
    else
     render :action => 'new'
    end
  end
end

因此我不知道在哪里创建祖先,文档说:

  

...您可以使用parent属性将记录组织到树中。如果您具有要用作父级的记录的ID,并且不想获取它,则还可以使用parent_id。与任何虚拟模型属性一样,parentparent_id可以使用记录上的parent=parent_id=进行设置,也可以将它们包含在传递给new的哈希中, createcreate!update_attributesupdate_attributes!。例如:

TreeNode.create! :name => 'Stinky', :parent => TreeNode.create!(:name => 'Squeeky')

我想知道我的控制器显示的内容,以便在创建时允许我设置@person的父级。

所以否则我被卡住了,我不知道还有什么要做的......但无论如何,我确实知道这个宝石类似于更受欢迎的acts_as_tree,任何帮助都非常感激!


更新

我想我几乎拥有它,但是当我为create action

尝试此操作时
def create
  @parent = Recipe.find(params[:parent])
  @recipe = Recipe.new(params[:recipe], :parent => @parent.id) do |recipe|
    recipe.user_id = current_user.id
  end
  if @recipe.save
    current_user.has_role!(:owner, @recipe)
    redirect_to @recipe
  else
    render :action => 'new'
  end
end

我明白了:

Couldn't find Recipe without an ID


更新

我的观点包含指向此new

<%= link_to "fork this recipe", {:controller => "recipes", :action => "new", :parent => @recipe} %>操作的链接

这似乎对我来说很好,当你到达表单recipes/new?parent=112时,url读得很好但是我仍然得到那个错误,必须有一种方法让该参数作为新创建的对象的父级。

2 个答案:

答案 0 :(得分:0)

如果它像acts_as_tree那样工作,那么我会假设你可以这样做:

@parent.children.create(attributes)

无论属性说什么,都将使用父集创建一个新的子对象。

答案 1 :(得分:0)

根据您粘贴的文档,您可以执行以下操作:

#...
@user = User.new(params[:user])
@user.parent_id = @parent_user.id
@user.save
#...

您也可以将其包含在用户的params哈希中 - 您的表单提交需要有参数[:user] [:parent_id]:

@user = User.create(params[:user])