我有一个Phrase
课程,has_many
Phrase
为Translation
。
class Phrase < ActiveRecord::Base
has_many :translatabilities
has_many :translations, through: :translatabilities
has_many :inverse_translatabilities, class_name: "Translatability", foreign_key: "translation_id"
has_many :inverse_translations, through: :inverse_translatabilities, source: :phrase
accepts_nested_attributes_for :translatabilities
end
class PhrasesController < ApplicationController
def index
@phrases = Phrase.all.page params[:page]
@translations = @phrases.count.times.map do |i|
translation = Phrase.new
translation.translatabilities.build
translation
end
end
end
我想添加&#34;可译性&#34;每个&#34;短语的形式&#34;。
<table>
<tbody>
<% @phrases.each do |phrase| %>
<tr>
<td><%= phrase.text %></td>
</tr>
<tr>
<td>
<%= form_for @translations do |f| %>
<%= f.text_field :text %>
<%= f.submit 'translate' %>
<%= f.fields_for :translatabilities do |t_form| %>
<%= t_form.hidden_field :id %>
<% end %>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
此代码具有无限循环错误。
undefined method `phrase_phrase_phrase_phrase_phrase_phrase_...
如何创建原始短语翻译表单?
class Translatability < ActiveRecord::Base
belongs_to :phrase
belongs_to :translation, :class_name => 'Phrase'
end
答案 0 :(得分:2)
我认为你可能会因为这种方法而使事情变得复杂。如果我理解正确,您可以将Phrase
翻译成多种语言。在我看来,你真正想要的是一个定义语言的Phrase
模型,并提供允许其他翻译相关的参考。
Phrase
看起来像这样:
create_table :phrases do |t|
t.text :body
t.string :locale
t.integer :translation_ref_id
end
在Phrase
模型中,您可以定义translations
方法:
def translations
self.class
.where(translation_ref_id: translation_ref_id)
.where.not(id: id)
end
在您的表单中,您将拥有多个Phrases
而不是具有嵌套属性的单个Phrase
。在控制器中,您可以为每个translation_ref_id
设置Phrase
(您可以使用任何唯一标识符,递增整数ID是好的;您不需要单独的模型来跟踪IDS)。