Hi everybody,
I’m having problems on a testcase that I’m working on. I hope that I can
explain the problem properly and that some of you can help me out
becouse I’m realy stuck on this one.
Ok, I have a Page model that needs to be multi lingual. Therefore I have
used a small but nice plugin: http://github.com/janne/model_translations
. Basically, I had to create a new model PageTranslation that conatains
the i18n attributes. Let me draw a small example:
Page
id
parent_id
PageTranslation
title
Now I want to use these object for the base of other objects. So I used
polymophisme on the page and page translation. Becouse of the
inheritance, I have created an abstract model for Page and
PageTranslation where other objects can inherit from. As an example
object, I’ll use a new object StaticPage. This is what I have so far:
class Page < ActiveRecord::Base
has_many :page_translations
belongs_to :content, :polymorphic => true
belongs_to :parent, :class_name => ‘Page’
has_many :children, :class_name => ‘Page’, :foreign_key => ‘parent_id’
end
class PageTranslation < ActiveRecord::Base
belongs_to :page
belongs_to :content_translation, :polymorphic => true
end
class PageModel < ActiveRecord::Base
self.abstract_class = true
has_one :page, :as => :content, :dependent => :destroy
validates_presence_of :page
validates_associated :page
after_save :save_page
translates :locale, :slug, :keywords, :description, :title, :content
Page.column_names.each do |attribute|
if attribute != “id”
define_method “#{attribute}=”.to_sym do |value|
init_page
self.page["#{attribute}"] = value
end
define_method "#{attribute}".to_sym do
self.page[attribute] if self.page
end
end
end
def children
self.page.children if self.page
end
private
def init_page
self.page = Page.new unless self.page
end
def save_page
self.page.save(false)
end
end
class PageTranslationModel < ActiveRecord::Base
self.abstract_class = true
has_one :page_translation, :as => :content_translation, :dependent =>
:destroy
validates_presence_of :page_translation
validates_associated :page_translation
after_save :save_page_translation
PageTranslation.column_names.each do |attribute|
if attribute != “id”
define_method “#{attribute}=”.to_sym do |value|
init_page_translation
self.page_translation["#{attribute}"] = value
end
define_method "#{attribute}".to_sym do
self.page_translation[attribute] if self.page_translation
end
end
end
private
def init_page_translation
self.page_translation = PageTranslation.new unless
self.page_translation
end
def save_page_translation
self.page_translation.save(false)
end
end
class StaticPage < PageModel
end
class StaticPageTranslation < PageTranslationModel
end
For testing, I’ve created a simple form like this:
<% form_for(@static_page, :url => static_pages_path , :html => { :id =>
“static-page-form” }) do |f| %>
<% end %>
This test works like a charm. The static page gets saved and the content
get synchronized with the page table. So that part works.
The part I can’t get to work, is the part with the translations.
I have used the model translation plugin on a simpler test case and got
it to work by adding the following to a model:
has_many :test_translations
after_update :save_translations
def new_translation_attributes=(translation_attributes)
translation_attributes.each do |attributes|
test_translations.build(attributes)
end
end
def existing_translation_attributes=(translation_attributes)
test_translations.reject(&:new_record?).each do |translation|
attributes = translation_attributes[translation.id.to_s]
if attributes
test_translation.attributes = attributes
else
test_translations.destroy(translation)
end
end
end
def save_translations
test_translations.each do |translation|
translation.save(false)
end
end
And have my form fields like this:
But I don’t seem to be able to implement this pattern in my abstract
PageModel.
It would be great if someone could help me out with this one, becouse I
don’t think I would be able to solve this without any help.
Thank you in advance