Ruby / Rails:动态更改共享部分中的属性

时间:2010-12-03 20:40:39

标签: ruby-on-rails ruby ruby-on-rails-3 partial-views

这应该是某人的上篮......

我正在尝试更改表单字段的属性,具体取决于哪个控制器/模型调用包含表单字段的部分...

问题(如下)是parent_id ...引用了dog表中的两列中的一列。它需要为kennel_idmaster_id,具体取决于呈现此部分的视图。

还不够舒服,使用Ruby / Rails语言/语法/工具动态更改它,而不会陷入if/else语句中。

我正在调用一个共享部分并传入一个局部变量:

= render "dogs/form", :parent => @kennel

= render "dogs/form", :parent => @master

在部分我想:

  = form_for ([parent, target.dogs.build]) do |f|
    = render "shared/error_messages", :target => parent

    .field
        = f.label :name
        = f.text_field :name
    .field
        = f.hidden_field :parent_id  ###  <= PROBLEM
    .actions
        = f.submit 'Save'

2 个答案:

答案 0 :(得分:1)

大声思考:

我不知道parent - 模型是否具有适当的名称,但您可以执行以下操作:

= f.hidden_field "#{parent.class.name.underscore}_id"

但这看起来不对。那么,为什么不将它作为一个参数传递呢?

= render "dogs/form", :parent => @master, :foreign_key => :master_id

或者,在狗模型上创建别名以处理某种动态委派:

class Dog
  def parent_id=(parent_id)
    case parent.class
    when Master then self.master_id = parent_id
    when Kennel then self.kennel_id = parent_id
    end
  end
  def parent_id
    case parent.class
    when Master then self.master_id
    when Kennel then self.kennel_id
    end
  end
end

但那也很糟糕。这种关系可以是多态的吗?然后你可以省去转换。

class Dog
  belongs_to :owner, :polymorphic => true
end

= f.hidden_field :owner_id

只是一些想法。希望其中一个对你有意义......

答案 1 :(得分:0)

哇,我最初的答案甚至都没有。我认为你想要的是一个多态关联:http://guides.rubyonrails.org/association_basics.html#polymorphic-associations这样,父母可以是你需要的任何类。