Ruby on rails 带Rails 5.1表单的嵌套资源

Ruby on rails 带Rails 5.1表单的嵌套资源,ruby-on-rails,ruby-on-rails-5.1,Ruby On Rails,Ruby On Rails 5.1,根据,我可以看到一个数组应该通过的model参数传递给form_。但是,当我提供以下内容时: <%= form_with(model: [@trip, @activity], local: true) do |f| %> ... <% end %> rake路由的输出类似于- trip_activities GET /trips/:trip_id/activities(.:format) activities#index

根据,我可以看到一个数组应该通过的model参数传递给
form_。但是,当我提供以下内容时:

<%= form_with(model: [@trip, @activity], local: true) do |f| %>
  ...
<% end %>
rake路由的输出类似于-

     trip_activities GET    /trips/:trip_id/activities(.:format)          activities#index
                     POST   /trips/:trip_id/activities(.:format)          activities#create
   new_trip_activity GET    /trips/:trip_id/activities/new(.:format)      activities#new
  edit_trip_activity GET    /trips/:trip_id/activities/:id/edit(.:format) activities#edit
       trip_activity GET    /trips/:trip_id/activities/:id(.:format)      activities#show
                     PATCH  /trips/:trip_id/activities/:id(.:format)      activities#update
                     PUT    /trips/:trip_id/activities/:id(.:format)      activities#update
                     DELETE /trips/:trip_id/activities/:id(.:format)      activities#destroy
               trips GET    /trips(.:format)                              trips#index
                     POST   /trips(.:format)                              trips#create
            new_trip GET    /trips/new(.:format)                          trips#new
           edit_trip GET    /trips/:id/edit(.:format)                     trips#edit
                trip GET    /trips/:id(.:format)                          trips#show
                     PATCH  /trips/:id(.:format)                          trips#update
                     PUT    /trips/:id(.:format)                          trips#update
                     DELETE /trips/:id(.:format)                          trips#destroy
和我的活动_controller.rb-

  before_action :set_activity, only: %i[show update edit destroy]

  def edit; end

  def update
    dates = calculate_datetimes(params[:date_range])
    @activity.assign_attributes(name: params[:name],
                                summary: params[:summary],
                                start_datetime: dates[0],
                                end_datetime: dates[1])
    if @activity.save
      flash[:success] = 'Activity successfully updated'
      redirect_to(@trip)
    else
      set_humanized_daterange
      render :edit
    end
  end

  private 

  def set_activity
    @activity = Activity.find(params[:id])
  end

tl;dr-我应该如何为嵌套资源设置表单,为什么该表单认为我要使用
活动路径
?理想情况下,我希望将此表单移动到一个分部中,并对我的“新建”和“编辑”操作使用相同的表单。

您只需将url添加到希望表单指向的路径,即:
、url:trip\u activity\u path
或您所点击的路径

尝试分别指定模型和url:

form_with(model: @activity, url: [@trip, @activity])
根据文档,
url
的值“类似于传递给url\u for或link\u to的值”,因此使用数组应该有效

这也适用于浅嵌套,因为阵列是压缩的。

添加到,如果要支持浅嵌套,还可以使用:

form_与(model:[@trip,@activity])

并将edit.html.erb上的渲染更改为将nil传递给trip,如:


并使其通过新的.html.erb中的trip模型更改url很好,但您可以更改模型,该模型允许构建器推断url和任何范围等:

<%= form_with(model: child.new_record? ? [@parent, child] : child, local: true) do |form| %>

新建/编辑视图:

控制器需要从url参数设置@parent,这是嵌套资源的惯例

<%= form_with(model: child.new_record? ? [@parent, child] : child, local: true) do |form| %>