鉴于这些模型:
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,但它不再使用该对象,因此不会在列表中选择传递的对象。
谢谢!
答案 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