【问题标题】:rails: nested form showing multiple input fields after savingrails:保存后显示多个输入字段的嵌套表单
【发布时间】:2014-07-22 22:22:49
【问题描述】:

我只想显示 1 个输入字段,这样我就可以填充我的列表。但是,每个保存的数据都是一个输入字段。我该如何防止这种情况?我只想显示列表和 1 个输入字段。

这是我的控制器:

def show
  @project.milestones.build
end

def new
  @project = Project.new
end

def create
  @project = Project.new(project_params)

  respond_to do |format|
    if @project.save
      format.html { redirect_to @project, notice: 'Project was successfully created.' }
      format.json { render :show, status: :created, location: @project }
    else
      format.html { render :new }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

这是我的看法:

<%= nested_form_for @project do |f| %>
    <%= f.fields_for :milestones do |milestone_fields| %>
    Milestone: <%= milestone_fields.text_field :item %>
  <% end %>
  <%= f.submit %>
<% end %>

我正在使用 Rails 4。不确定这是否重要


【问题讨论】:

  • 你能发布你的控制器动作吗,特别是new,createmethod 包含params
  • @Pavan 你好,我已经更新了我的 OP 以显示新的和创建的

标签: ruby-on-rails ruby-on-rails-4 nested-forms nested-attributes


【解决方案1】:

首先,您需要遍历里程碑并打印每个里程碑

<% @project.milestones.each do |m| %>
  <p><%= m.item %></p>
<% end %>

然后你需要添加一个文本字段来插入一个新的里程碑:

<%= f.fields_for :milestones, @project.milestones.build do |milestone_fields|
  <%= milestone_fields.text_field :item %>
<% end %>

同时删除控制器中 show 方法中的代码。

与您的代码的唯一区别是我告诉fields_for 在这种情况下应该使用什么数组@project.milestones.build 应该返回一个唯一元素而不是所有集合

【讨论】:

  • 成功!!这就是我需要的!
【解决方案2】:

迭代列表然后在视图中构建新对象,这应该可以工作。

<%= form_for @project do |f| %>
    <% @project.milestones.each do |m| %>
        <p><%= m.item %></p>
    <% end %>
    <%= f.fields_for @project.milestones.build do |ff| %>
        Milestone: <%= ff.text_field :item %>
  <% end %>
  <%= f.submit %>
<% end %>

【讨论】:

  • 我的代码不是一样的东西只是减去了列表吗?另外,如果我将 :milestones 更改为 @project.milestones.build,它不会保存到数据库中
  • 一般来说,每当我做这样的事情时,我都会远离嵌套表单并渲染“里程碑/表单”。否则,你是对的。基本上是一样的,只是你告诉它为每个项目里程碑构建 form_fields 而不是一个全新的实例。
  • 是的。但我想要嵌套表单,这样我就可以将项目 ID 与里程碑相关联。但我想我可以创建一个隐藏字段,对吧?
【解决方案3】:

是的,将构建对象传递给嵌套表单工作 和上面类似

<%= f.fields_for :milestones, @project.milestones.build do |milestone_fields|
<%= milestone_fields.text_field :item %>

这在使用嵌套表单将多种样式的产品添加到购物车时很有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多