强制命名空间模型表单以使用根类名称

时间:2012-09-04 16:45:07

标签: ruby-on-rails ruby-on-rails-3 mongoid mongoid3

我正在使用命名空间模型为平台分配不同类型的服务:

关系:Platform has_many :services& Service belongs_to :platform

Inhéritance:Service::Service1 < ServiceService::Service2 < Service

每种服务类型都有一组不同的字段(我使用的是Mongoid,因此字段被声明为模型,“submodel”类型存储在_type字段中。)

ServicesController::new中,我实现了这样的新服务:

def new
  klass    = "service/#{params[:type]}"
  @service = klass.camelize.constantize.new 
  render :form
end

params[:type]由路由参数(类似/:platform_id/services/new/:type

提供

在我的form视图中,我现在可以根据服务类型显示字段(它是Haml + simple_form):

= simple_form_for @service do |f|

[...]

  - case @service.class

  - when Service::Service1
    = f.input :field1

[...]

到目前为止,一切正常:生成的HTML输入如下所示:

<input class="string required" id="service_service1_field1" name="service_service1[field1]" size="50" type="text">

service_service1[field1]作为字段名称,我的params哈希将包含不同的密钥,具体取决于子服务,并且在我的控制器的create操作中,我将不得不写一个案例/何时为每个子服务,而service[field1]将“干掉”我的代码(我只需要添加一个隐藏字段和确切的模型来实例化)。

在使用命名空间模型时,有没有办法强制Rails将根类用作字段名?

修改:提交按钮的相同问题i18n:Rails查找helpers.submit.service_service1.create,我希望helpers.submit.service.create查找{{1}},因为所有服务的文字都相同

1 个答案:

答案 0 :(得分:1)

您是否尝试过:as选项?我已将此用于子类,但不用于名称空间。您可能需要使用:url选项进行一些额外的体操,以使您的表单发布到正确的位置。

If you have an object that needs to be represented as a different parameter, 
like a Person that acts as a Client:

<%= form_for(@person, :as => :client) do |f| %>
  ...
<% end %>

取自Rails docs