如何在编辑页面中的rails中自动填充form_form标记字段

时间:2012-04-20 05:11:41

标签: ruby-on-rails forms edit

据我所知,如果有人进入对象编辑路径,则应填充form_for字段。除了这一个字段之外,大多数地雷都会这样做,它与另一个表有一个has_many:through关系。如何在预先填充创建时输入的内容?

例如......

        <div class="lesson_content">
            <%= f.label :content %>
            <%= f.text_area :content %>
        </div>

        <div class="tags">
            <%= f.label :tag_names, "Tags" %>
            <%= f.text_field :tag_names, data: { autocomplete_source: tags_path} %>
        </div>

我的课程内容将正确填充,但不会填充我的代码字段。我有一个课程表,标签表和介入的tags_relationship表。

我的课程是......

class Lesson < ActiveRecord::Base
  attr_accessible :title, :desc, :content, :tag_names
  belongs_to :user

  has_many :tag_relationships, :autosave => true 
  has_many :tags, :through => :tag_relationships, :autosave => true

如何填充标记字段?感谢

2 个答案:

答案 0 :(得分:2)

您需要的是在表单中嵌套的fields_for。详情请见http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

更好的是,看看Ryan Bates发布的这个精彩的截屏视频,他刚刚发布了http://railscasts.com/episodes/196-nested-model-form-revised

答案 1 :(得分:1)

您需要从课程课程中拨打accepts_nested_attributes_for

# app/models/lesson.rb
class Lesson < ActiveRecord::Base
  attr_accessible :title, :desc, :content, :tag_names
  belongs_to :user

  has_many :tag_relationships, :autosave => true 
  has_many :tags, :through => :tag_relationships, :autosave => true

  accepts_nested_attributes_for :tags
end

然后,在你的控制器/视图中:

# app/controllers/lessons_controller.rb
class LessonsController < ActiveSupport::Controller
  def edit
    @lesson = Lesson.find(params[:id])
  end
end

<%= form_for(@lesson) do |f| %>
  <div class="lesson_content">
    <%= f.label :content %>
    <%= f.text_area :content %>
  </div>

  <div class="tags">
    <%- @lesson.tags.each do |tag| -%>
      <%= fields_for(tag) do |t| %>
        <%= t.label :name, "Tag" %>
        <%= t.text_field :name, data: { autocomplete_source: tags_path} %>
      <%- end -%>
    <%- end -%>
  </div>
<%- end -%>

但是,这会显示每个标记的文本字段。如果要对所有标记使用单个文本字段(例如,用逗号分隔),并检索按标记过滤的课程,则应检查此gem:acts-as-taggable-on