1

我知道如果有人进入对象编辑路径,则应该填充 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

我如何让标签字段填充?谢谢

4

2 回答 2

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

于 2012-04-20T05:39:45.983 回答
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

于 2012-04-24T06:39:25.190 回答