【问题标题】:undefined method path with simple form具有简单形式的未定义方法路径
【发布时间】:2014-08-01 18:22:15
【问题描述】:

我有 albumspictures 其中albums hasmany pictures

这是我的路线.rb

 resources :albums do
  resources :photos
end

我的路径不是photos_path,而是album_photos_pathmy photos/new.html.erb 我收到此错误:

undefined method photos_path' for #<#<Class:0x5232b40>:0x3cd55a0>

我怎样才能代替 photos_path 简单的形式写 album_photos_path

我的 new.html.erb

<%= simple_form_for([@album, @photo]) do |f| %>
<%= f.error_notification %>

<div class="form-inputs">
<%= f.input :title %>
<%= f.input :description %>
</div>

<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>

【问题讨论】:

  • 您可以从控制器发布您的new 操作吗?
  • 您的照片控制器新操作中是否有@album 和@photo=@album.photos.new。

标签: ruby-on-rails ruby-on-rails-4 simple-form


【解决方案1】:

您可以在表单中指定url。像这样:

<%= simple_form_for @photo, url: album_photos_path do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :title %>
    <%= f.input :description %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

但您的代码也应该可以工作。在您的新操作中,您是否同时初始化了@album 和@photo,类似于:

def new
  @album = Album.find params[:album_id]
  @photo = @album.pictures.build
end

P.S 上面的代码只是一个示例代码,如果两个变量(@album 和@photo)都正确初始化,那么 rails 会自动生成正确的 url。

【讨论】:

  • @max 来回答您提到的问题,第一部分不是埋葬错误的蹩脚尝试,它为您提供了另一种在表单中显式添加 url 的方法。另外,我看不出我的答案的第二部分与您发布的内容有何不同。我可以看到您正在使用album_id 初始化专辑,但这仅取决于用例。你知道OP是否要将照片附加到现有相册吗?如果您查看问题下方的 cmets,则有人已经要求他添加控制器代码
  • @max 另外,如果您再次检查我的答案,我已经明确提到如果相册和照片对象在新操作中正确初始化,他的代码将起作用,指定 "something在添加示例代码之前喜欢"
  • 我不知道您是否不了解问题或嵌套路由的概念。传递未保存的相册也会导致错误,因为它没有 id。
【解决方案2】:

你需要设置父资源。

class PhotosController < ApplicationController
  before_action :set_album

  # GET /albums/1/photos/new
  def new
    @photo = @album.photos.new
  end

  # POST /albums/1/photos
  def create
    @photo = @album.photos.new(photo_params)
    # ...
  end

  private

  # ...

  def set_album
    @album = Album.find(params[:album_id])
  end
end

rails 尝试调用photos_path 的原因是多态路由助手将模型数组转换为路由助手方法压缩数组。 url_for([nil, Photo.new]) 将产生与 url_for(Photo.new) - photos_path 相同的结果。

【讨论】:

  • 我选择在 8 年后写一个答案,因为这个问题仍然被引用,并且这个问题的公认答案实际上并没有解决问题,只是引入了新的错误。
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2020-05-18
  • 2016-07-03
相关资源
最近更新 更多