簡體   English   中英

嵌套資源w / Rails 5.1 form_with

[英]Nested Resources w/ Rails 5.1 form_with

根據這個拉取請求,我可以看到一個數組應該傳遞給form_with的模型參數。 但是,當我提供以下內容時:

<%= form_with(model: [@trip, @activity], local: true) do |f| %>
  ...
<% end %>

Rails將返回 - ActionView::Template::Error (undefined method activity_path' for #<#<Class:0x007f80231e3070>:0x007f8023010dd8>):

我的路線文件如下:

  resources :trips do
    resources :activities
  end

rake routes的輸出看起來像 -

     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

還有我的activities_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 - 我應該如何為嵌套資源設置form_with,為什么這個表單認為我想使用activity_path 理想情況下,我想將此表單移動到一個部分,並對我的#new和#edit操作使用相同的表單。

嘗試分別指定模型和網址:

form_with(model: @activity, url: [@trip, @activity])

根據文檔, url的值是“類似於傳遞給url_for或link_to的值”,因此使用數組應該有效。

這也適用於淺嵌套,因為陣列是壓縮的。

您只需要將url添加到您希望表單指向的路由,即: , url: trip_activity_path或您正在, url: trip_activity_path的路徑是什么

添加到最大答案 ,如果您想支持淺嵌套,您還可以使用:

form_with(model: [@trip, @activity])

並更改edit.html.erb上的渲染以將nil傳遞給trip,例如:

<%= render 'form', trip: nil, activity: @activity %>

並保持它在你的new.html.erb中傳遞旅行模型

更改網址很好,但您可以改為允許構建器推斷網址和任何范圍等的模型:

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

新建/編輯視圖: <%= render 'form', child: @child %>

控制器需要從url params設置@parent,這無論如何都是嵌套資源的慣例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM