在Rails中显示子类模型名称,形成子类共享的助手

时间:2011-07-17 19:50:35

标签: ruby-on-rails ruby-on-rails-3 inheritance

鉴于这些模型:

class Person
end

class Man < Person
  def edit 
    @person     = Man.find(params[:id])

    respond_to do |format|
      format.js { render :template => "man_form" } }
    end
  end
end

class Woman < Person
  def edit 
    @person     = Woman.find(params[:id])

    respond_to do |format|
      format.js { render :template => "woman_form" } }
    end
  end
end

然后在每种形式中,我使用所有人共享的辅助方法创建“特征”的“选择”:

def person_select(person, options)
  select :person, "characteristics", options
end

我如何做到这一点,当它被一个子类(男人或女人)调用时,它会创建具有该模型名称的选择名称,而不是父“人”?

所以,我希望能够致电:

person_select(@man_object, {...})

并获得:

<select name="man[age]" id="man_age">
...
</select>

我需要这样做的原因是,当提交表单时,我可以从woman_controller中获取params [:man]形成man_controller或params [:woman],并且能够使用这些特定的对象类型,并且不是'人'。

我可以获得类名并执行: 选择person.class.to_s.underscore,但它不再使用该对象,因此不会在列表中选择传递的对象。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以询问它属于哪个类,然后调用该类的名称。

$ Post.first
=> #<Post id: 1>
$ Post.first.class
=> Post(id: integer, title: string)
$ Post.last.class.name
=> "Post"

让我感到困惑的是你有一个@man_object所以很明显这个对象是一个男人,这意味着你可以只有两个帮手,假设你还有一个女人对象:

man_select(@man_object, {...})
woman_select(@man_object, {...})

然后是你的select_fields

def man_select(person, options)
  select_tag :man, "characteristics", options
end 

def woman_select(person, options)
  select_tag :woman, "characteristics", options
end

但如果你不知道这是男人还是女人:

man_select(@person, {...})

然后你的select_tag:

def person_select(person, options)
    if person.class.name = "Man"
        select_tag :man, "characteristics", options
    else
        select_tag :woman, "characteristics", options
    end
end