Rails form_for 具有相同属性的嵌套和关联资源已填充文本

Posted

技术标签:

【中文标题】Rails form_for 具有相同属性的嵌套和关联资源已填充文本【英文标题】:Rails form_for nested and associated resources with same attributes has text filled in 【发布时间】:2021-11-28 08:02:01 【问题描述】:

我正在为两个关联模型播放列表和视频创建嵌套表单,它们也是嵌套资源,我正在尝试创建嵌套表单。每个播放列表有许多视频,每个视频属于一个播放列表。它们都具有标题和描述的属性。转到 new_playlist_video_path 会导致将播放列表的标题和描述放入视频的表单字段中。

** 更新 ** 当我访问 new_playlist_video_path(playlist) 时,视频表单呈现,但控制器认为我在 playlist#update 中并向播放列表路径发送补丁请求。

路线

 resources :playlists do
    resources :videos
  end

我的控制器

before_action :set_playlist, only: %i[new edit update create]

 # GET /videos/new
  def new
    @video = @playlist.videos.build
  end

  private


  def set_playlist
    @playlist = Playlist.find(params[:playlist_id])
  end

视频#新

<%= form_for([@video, @playlist], url: playlist_videos_path, class: "contents") do |form| %>
  <% if @video.errors.any? %>
    <div id="error_explanation" class="bg-red-50 text-red-500 px-3 py-2 font-medium rounded-lg mt-3">
      <h2><%= pluralize(@video.errors.count, "error") %> prohibited this video from being saved:</h2>

      <ul>
        <% @video.errors.each do |error| %>
          <li><%= error.full_message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="my-5">
    <%= form.label :title %>
    <%= form.text_field :title, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %>
  </div>

  <div class="my-5">
    <%= form.label :description %>
    <%= form.text_area :description,  text: nil , rows: 4, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %>
  </div>

  <div class="inline">
    <%= form.submit class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium" %>
  </div>
<% end %>

我可以更改视频的属性,但这似乎工作量太大,因为我必须重新编写验证、测试和大量 html。如何让我的视频表单不显示其所属模型的标题和描述?

【问题讨论】:

我真的不明白你在这里做什么,听起来你真正想要的是视频和播放列表之间的多对多关联,并且只是关联视频和播放列表而不是创建新的视频实例。您能否尝试从高级用户 POV 而非细节来描述您正在做的事情? 创建与播放列表关联的视频。播放列表有很多视频视频属于播放列表。一切都准备好了,谢谢!! 【参考方案1】:

我的表格错了,应该是的


<%= form_for([@playlist, @video, ], class: "contents") do |form| %>
~~~ form contents 

【讨论】:

除非这是一个遗留应用程序(Rails 5.1 之前),否则您应该使用form_with(model: [@playlist, @video], class: "contents")form_for 是一种遗留方法,预计会被贬低和删除。 不知道谢谢!

以上是关于Rails form_for 具有相同属性的嵌套和关联资源已填充文本的主要内容,如果未能解决你的问题,请参考以下文章

在不同位置放置Rails Form_For字段

Rails - 创建具有嵌套属性的记录

Rails:form_for 复选框设置为 true 或 false 是不是选中/取消选中该框

Rails 嵌套模型和虚拟属性初始化

Rails 5:form_for 与 form_with

Rails 将 form_for 对象传递给部分