Отображение имени модели подкласса в помощнике по форме в Rails, совместно используемом подклассами - PullRequest
0 голосов
/ 17 июля 2011

С учетом этих моделей:

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>

Причина, по которой мне нужно это сделать, заключается в том, что при отправке формы я могу получить params [: man] из man_controller или params [: woman] из woman_controller и иметь возможность работать с этими конкретными типами объектов, и не «человек».

Я мог бы получить имя класса и сделать: выберите person.class.to_s.underscore, но тогда он больше не использует объект, поэтому переданный объект не будет выбран в списке.

Спасибо!

1 Ответ

0 голосов
/ 18 июля 2011

Вы можете спросить, к какому классу он принадлежит, а затем назвать имя этого класса.

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...