【问题标题】:Nested Resources w/ Rails 5.1 form_with带有 Rails 5.1 form_with 的嵌套资源
【发布时间】:2017-10-24 20:03:09
【问题描述】:

根据this pull request,我可以看到应该将一个数组传递给form_with 的模型参数。但是,当我提供以下内容时:

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

Rails 将返回 - ActionView::Template::Error (undefined method activity_path' for #&lt;#&lt;Class:0x007f80231e3070&gt;:0x007f8023010dd8&gt;):

我的路线文件如下所示:

  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

还有我的activity_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 操作使用相同的表单。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5.1


    【解决方案1】:

    尝试分别指定型号和网址:

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

    根据文档,url 的值是“类似于传递给 url_for 或 link_to 的值”,因此使用数组应该可以工作。

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

    【讨论】:

    • 请注意,这实际上不应该是必需的,并暗示您的应用程序中有意外的 nil 或其他错误。如果可能,我会删除答案。
    【解决方案2】:

    您只需将 url 添加到您希望表单指向的路由中,即:, url: trip_activity_path 或您点击的任何路径

    【讨论】:

      【解决方案3】:

      添加到max answer,如果你想支持浅嵌套也可以使用:

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

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

      &lt;%= render 'form', trip: nil, activity: @activity %&gt;

      并让它通过你的 new.html.erb 中的行程模型

      【讨论】:

        【解决方案4】:

        更改 url 没问题,但您可以改为更改允许构建器推断 url 和任何范围等的模型:

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

        新/编辑视图:&lt;%= render 'form', child: @child %&gt;

        控制器需要从 url 参数中设置 @parent,这无论如何都是嵌套资源的约定。

        【讨论】:

          猜你喜欢
          • 2018-04-03
          • 1970-01-01
          • 2017-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多