如何构建一个具有has_many关系的模型表单

时间:2015-12-09 08:34:32

标签: ruby-on-rails has-many-through

我有一个Phrase课程,has_many PhraseTranslation

应用程序/模型/ phrase.rb

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

应用程序/模型/ phrases_controller.rb

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;。

应用程序/视图/短语/ index.html.erb

<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_...

如何创建原始短语翻译表单?

应用程序/模型/ translatability.rb

class Translatability < ActiveRecord::Base
  belongs_to :phrase
  belongs_to :translation, :class_name => 'Phrase'
end

1 个答案:

答案 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)。