没有路由匹配[POST]“/ companyrating / index”

时间:2013-12-25 07:30:19

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

我是ruby on rails的新手。我收到了这个错误。我已按照本教程http://www.codelearn.org/ruby-on-rails-tutorial/forms-form_tag-params-attr_accessible-model-validation  用于表单发布。但是,当我点击提交时,我收到了错误

这是我的 控制器

class CompanyratingController < ApplicationController
  def index
     @companies = Companyrating.all
  end


 def add
   #companies.create(:companies => params[:name, :place, :rate, :rank])
   #redirect_to :action => 'index'
    @companies = Companyrating.new(params[:name])
  if @companies.save
    flash[:success] = "Welcome to My Space!"
    redirect_to root_url
   end
 end

end

这是模态

class Companyrating < ActiveRecord::Base
    attr_accessible :name, :place, :rate, :rank

end

这是我的路线档案

get "companyrating/index"
match "companyrating/add" => "todos#add", :via => :post

我的索引文件

<title>Shared Todo App </title>
<h1>Shared Todo App</h1>
<p>All your todos here</p>
<ul><li> <% @companies.each do |t| %>
  <li> <%= t.companies_name %> </li>
  <li> <%= t.companies_place %> </li>
  <li> <%= t.companies_rate%> </li>
  <li> <%= t.companies_rank %> </li>
<% end %>
  </li></ul>

  <%= form_for("@companies/add", :method=>"post") do |f| %>


      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :place %>
      <%= f.text_field :place %>

        <%= f.label :rate %>
      <%= f.text_field :rate %>

      <%= f.label :rank %>
      <%= f.text_field :rank %>
       <%= f.label :user_id%>
      <%= f.text_field :user_id %>

      <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
    <% end %>

这是我的错误:没有路线匹配[POST]“/ companyrating / index”

任何人都可以帮我解决这个错误

2 个答案:

答案 0 :(得分:1)

控制器中的

def new
  @companyrating = Companyrating.new
end

def create
  @companies = Companyrating.new(params[:companyrating])
  if @companies.save
    flash[:success] = "Welcome to My Space!"
    redirect_to root_url
  else
    flash[:error] = "Can't create companyrating."
    render 'new'
  end
end

在routes.rb中:

resources :companyrating

形式:

<%= form_for(@companyrating, method: :post) do |f| %>

答案 1 :(得分:0)

您所遇到的问题有两方面 - 您的routescontroller actions

我知道Monk_Code给出了答案,但是既然你是新手,我将解释它是如何为你工作的,目的是帮助你更好地理解系统:


<强>路线

你的第一个问题是你的路线

Rails在创建出色的路由结构方面做得非常出色,其核心是resourceful routes

的想法

通过使用以下代码,您的Rails应用程序会创建一系列7条路由,Rails使用这些路由向控制器操作发送“默认”流量:

#config/routes.rb
resources :companyratings

此路由结构在您的应用中创建以下路由:

  
      
  • new [GET]
  •   
  • index [GET]
  •   
  • 创建[POST]
  •   
  • 编辑[GET]
  •   
  • 更新[POST]
  •   
  • 销毁[DELETE]
  •   
  • 显示[GET]
  •   

所有这些路由都采用定向流量,路由它采用相关的控制器操作。这意味着,如果您将用户发送到/companyratings/,则会加载index操作,同样/companyratings/15显示控制器中的show动作

除此之外,您还需要知道HTTP“动词”的作用。这是Rails用于相应地路由您的流量的关键原则。请求中的“动词”是发送的请求类型,并且取决于浏览器

从上面的列表中可以看出,每个路由都有一个关联的HTTP动词。这很重要的原因是因为如果您向只能使用[GET]动词的路由发送[DELETE]请求,那么您将遇到问题,因此您在看到错误时会遇到错误您向[POST]行动发送了index个请求

您应该阅读Rails tutorial,因为您可以通过发送正确的HTTP动词(使用:method => :get)来解决问题,或者在{{[POST]中指定index动词1}}行动路线


控制器操作

控制器操作是控制器中定义的函数,在Rails中运行特定请求时会加载该函数

上面列出了默认索引操作,但只要提供正确的路由,您也可以拥有自己喜欢的任何其他操作。您的问题是您刚刚使用了add操作,您应该使用create操作:

class CompanyratingController < ApplicationController
  def index
     @companies = Companyrating.all
  end

 def new
      @companyrating = Companyrating.new
 end

 def create
  @companies = Companyrating.new(new_company_rating)
  if @companies.save
    flash[:success] = "Welcome to My Space!"
    redirect_to root_url
   end
 end

 private
 def new_company_rating
      params.require(:company_rating).permit(:variables, :listed, :here)
 end

end