【问题标题】:undefined method `pushes_path' for #<#<Class:0x007f85a15c6c90>#<#<Class:0x007f85a15c6c90> 的未定义方法“pushes_path”
【发布时间】:2014-10-12 08:47:02
【问题描述】:

过去 5 小时我一直在尝试解决这个错误,如果我不能解决这个问题,我会烧掉我的电脑。

undefined method `pushes_path' for # 这是我得到的错误代码,但我不明白为什么。

这是我在交互中的 index.html.erb 文件

<%= simple_form_for @push do |f| %>

  <%= f.input :payload, as: :text %>
  <%= f.input :segment, as: :radio_buttons %>
  <%= submit_tag "start the campaign" %>

<% end %>

这是我的交互控制器

class InteractionController < ApplicationController

def index

    @push =Push.new

end

end

Push 是我在数据库中的表,我将获取输入并将它们写入数据库以供以后使用。

这是我的路线文件

  devise_for :partners
  get 'home/index'
  get 'segmentation/index'
  get 'interaction/index'

root to: "home#index"

我真的不知道它为什么要寻找 pushes_path,我做错了什么?

【问题讨论】:

  • 尝试将resources :pushes 添加到您的routes.rb 文件中。
  • 请不要烧毁你的电脑——没有人喜欢烧毁无辜的电脑!
  • 先生,我现在给你写一个答案!

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 routes


【解决方案1】:

form_for

您遇到的问题是您的form_for 方法将尝试根据您的@path 对象生成路由。因此,如果您没有为其创建路径,您将收到您收到的错误:

:url- 要提交表单的 URL。这可以表示 与传递给 url_for 或 link_to 的值相同。所以例如 您可以直接使用命名路由。当模型表示为 字符串或符号,如上例所示,如果 :url 选项不是 指定,默认情况下表单将被发送回当前 url (我们将在下面描述另一种面向资源的用法 不需要显式指定 URL 的 form_for)。

底线是,由于 Rails 是 object orientated,它是建立在假设您将设置 路由 来处理单个对象的创建的。

每次您使用 form_for 时,Rails 都会尝试从您的 object 构建您的路线——因此,如果您尝试执行以下操作,它会将路线视为 photo_path 等:

#app/views/pushes/new.html.erb
<%= form_for @push do |f| %>
   ...
<% end %>

--

修复

正如@mandeep 建议的那样,您可以采用几个修复程序来使其正常工作:

首先,您可以为您的 push 对象创建一个路由:

#config/routes.rb
resources :pushes

其次,当您使用不同的控制器时,您需要执行以下操作:

#config/routes.rb
resources :interactions

#app/views/pushes/new.html.erb
<%= form_for @push, url: interaction_path do |f| %>
   ...
<% end %>

这会将您的表单提交路由到 interactions 控制器,而不是您默认获得的 pushes 控制器!


对象

在创建基于 Rails 的后端时需要考虑的是框架的 object-orientated 特性。

由于基于 Ruby 构建,Rails 以objects 为中心 - 变量 的术语,它基本上包含的不仅仅是一条数据。在 Rails 的情况下,对象旨在为应用程序提供:

一旦您理解了这一点,Rails 的整个功能范围就会变得一目了然。诀窍是要意识到您在 Rails 中所做的每件事都应该与一个对象相关联。这也适用于 控制器

--

有没有想过为什么要在路由中调用 resources 指令作为控制器?这是因为您正在为此创建一组resourceful routes

你看到它是如何面向对象的吗?

这使您能够为特定控制器等定义路由。需要注意的最重要的一点是,这将使您能够确定您的请求应该执行哪些路由/控制器操作

--

使用控制器设置没有任何问题 - 最重要的是确保您能够定义自定义 URL 参数,以适应非基于对象的结构

【讨论】:

  • 感谢您的长回答。为什么假设它的推送控制器?因为 Push.new 创建?
  • 是的——这都是关于 Rails / Ruby 是面向对象的。我会更新我的答案来解释
【解决方案2】:

在您的索引操作中,您有

def index
  @push =Push.new
end

你的表单有

<%= simple_form_for @push do |f| %>

所以您的表单正在寻找带有后置动词或 pushes_path 的 /pushes 而您的 routes.rb 文件中没有该路由,因此要解决此问题,您需要将其添加到路线.rb:

resources :pushes

更新:

当您添加resources :push 时,基本上creates seven different routes 会为您添加。其中之一是

POST    /pushes pushes#create   create a new push

如果您查看表单生成的 html,它会是这样的:

<form action="/pushes" class="new_push" id="new_push" method="post">
  // your fields
</form>

注意动作和动词,所以当您提交表单时,会检查您的路线,并且由于您没有在路线中定义它们,您会收到此错误

我将如何使用我从这个表单中获得的参数和这个新的资源添加?

您的表单将带您进入 pushes_controller 创建操作,因此首先您必须定义它们。您可以在控制器操作中通过 params[:pushes] 简单地访问它们,但由于您要创建新记录,因此您必须允许这些属性,请查看 strong parameters

如果你使用 rails >= 4 那么你可以这样做

class PushesController < ApplicationController

  def create
    @push =Push.new(push_params)
    if @push.save
      redirect_to @push
    else
      render 'interaction/index'
    end
  end

  private
    def push_params
      params.require(:push).permit(:attributes)
    end
end

如果您使用的是 rails

attr_accessible :attribute_name 

为什么它假设它的推送控制器?因为 Push.new 创建?

那是因为如果您查看您的索引操作@push = Push.new,那么@push 包含一个带有 nil 值的推送对象(因为您刚刚初始化它)所以这就是 rails 魔术的用武之地,rails 会自动尝试找出您的 url形式,并且由于您的 @push 只是一个初始化变量,因此 rails 会带您为它创建操作。有关详细信息,您应该检查 rails polymorphic urls 如果您希望您的表单转到 interaction_controller 或其他一些 url,那么您必须为其指定 url 选项

<%= form_for @push, url: "your_url_for_custom_method" %>
  // other fields
<% end %>

最后你真的应该阅读docs

【讨论】:

  • 所以每次我从我的表中创建一个新变量时,我都需要将其作为资源?我将如何使用从这个表单获得的参数和这个新资源添加?非常感谢它的工作,但如果你也回答我的问题,我会非常高兴:)
  • @railsnewbie 否,因为您正在创建资源,在您的情况下是推送记录,因此您需要一条路线。你用的是rails 4?将相应地更新我的答案
  • @railsnewbie 我在等你告诉我你正在使用哪个 Rails 版本,无论如何更新了我的答案:)
  • 我按照您的指示做了所有事情,但我收到此错误找不到 PushesController 的操作“更新”您有什么想法吗
  • 另一件事是,我成功创建了每个对象,但只有创建时间和更新时间的时间戳,它不会与传入的属性一起保存。是因为给定的错误吗?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2016-05-19
  • 2018-04-02
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多