Ruby on rails 未定义的方法“push#u path';对于#<#&书信电报;等级:0x007f85a15c6c90>;

Ruby on rails 未定义的方法“push#u path';对于#<#&书信电报;等级:0x007f85a15c6c90>;,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,routes,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Routes,在过去的5个小时里,我一直在试图解决这个错误,如果我不能解决这个问题,我会烧掉我的电脑 未定义的方法“pushs#u path”用于#这是我得到的错误代码,但我不明白为什么 这是交互中的index.html.erb文件 <%= simple_form_for @push do |f| %> <%= f.input :payload, as: :text %> <%= f.input :segment, as: :radio_buttons %>

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

未定义的方法“pushs#u path”用于#这是我得到的错误代码,但我不明白为什么

这是交互中的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 %>

我真的不知道为什么它在寻找路径,我做错了什么?

在你的索引操作中

def index
  @push =Push.new
end
你的表格已经

<%= simple_form_for @push do |f| %>
更新:

添加
资源时:基本上为您推送
rails。其中之一就是

POST    /pushes pushes#create   create a new push
如果您查看表单生成的html,它将类似于:

<form action="/pushes" class="new_push" id="new_push" method="post">
  // your fields
</form>
如果您使用的是rails<4,那么不允许这些属性(因为强参数特性来自rails 4),您必须告诉rails这些属性可以通过在push.rb中写入来访问

attr_accessible :attribute_name 
为什么它会假设它的控制器是Push?因为Push.new创建的

这是因为如果您查看索引操作
@push=push.new
so@push包含一个具有nil值的push对象(正如您刚刚初始化的那样),这就是rails魔力的来源,rails会自动尝试找出表单的url,因为@push只是一个初始化变量,所以rails会带您为它创建操作。有关详细信息,您应该签出rails如果希望表单转到interaction\u controller或其他url,则必须为其指定url选项


//其他领域

最后,你真的应该读一下

表格

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

:url
-表单要提交到的url。这可能是有代表性的 与传递给url\u或链接到的值的方式相同。比如说 您可以直接使用命名路由。当模型由 字符串或符号,如上面的示例所示,如果:url选项不可用 指定时,默认情况下表单将发送回当前url (我们将在下面描述一种替代的面向资源的 不需要显式指定URL的表单)

底线是,正如Rails一样,它是基于这样一个假设构建的:您将设置路由来处理单个对象的创建

每次您为
使用
form\u时,Rails都会尝试从您的
对象
构建路由——因此,如果您尝试执行以下操作,它会将路由视为
照片路径
等:

#app/views/pushes/new.html.erb
<%= form_for @push do |f| %>
   ...
<% end %>
其次,当您使用不同的控制器时,您需要执行以下操作:

#config/routes.rb
resources :interactions

#app/views/pushes/new.html.erb
<%= form_for @push, url: interaction_path do |f| %>
   ...
<% end %>
#config/routes.rb
资源:互动
#app/views/push/new.html.erb
...
这将把表单提交路由到
交互
控制器,而不是默认情况下得到的
推送
控制器


对象

创建基于Rails的后端时要考虑的是框架的本质。 由于构建在Ruby上,Rails以

对象为中心,这是一个变量术语,它基本上不仅仅包含一段数据。对于Rails,对象的设计目的是为应用程序提供:

一旦您了解了这一点,Rails的全部功能就变得显而易见了。诀窍是认识到在Rails中所做的一切都应该绑定到一个对象。这也适用于控制器:

--

你有没有想过为什么在你的路线中为一个控制器调用
资源
指令?这是因为您正在为它创建一组基于:

你知道它是如何面向对象的吗

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

--


使用控制器设置没有什么错-最重要的是确保能够定义自定义URL参数,为了适应非基于对象的结构

请尝试添加
资源:将
推送到您的
routes.rb
文件中。请不要烧掉您的计算机-没有人喜欢烧掉无辜的计算机!先生,我现在就给您写一封回信!所以每次我要从我的表中创建一个新变量时,我都需要将它作为一个资源?我如何才能将从这个表单中获得的参数与这个新的资源添加一起使用?thnx虽然如此,但如果您也能回答我的问题,我会非常高兴:)@railsnewbie no因为您正在创建一个资源,在您的情况下是一个推送记录,所以您需要一个路径。您正在使用rails 4?将更新我的答案accordingly@railsnewbie我一直在等你告诉我你使用的是哪个rails版本,无论如何更新了我的答案:)我按照你的指示做了所有的事情,但是我发现了这个错误,PushesController的操作“更新”找不到,你有什么想法吗,我成功地创建了每个对象,但只有在创建和更新的时间戳,它不会将其与传入的属性一起保存。这是因为给定的错误吗?谢谢你的详细回答。为什么它会假设它推送控制器?因为推送。新创建?是的-这都是关于Rails/Ruby是面向对象的。我会更新我的答案来解释
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
attr_accessible :attribute_name 
<%= form_for @push, url: "your_url_for_custom_method" %>
  // other fields
<% end %>
#app/views/pushes/new.html.erb
<%= form_for @push do |f| %>
   ...
<% end %>
#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 %>