【问题标题】:Rails: form_for active record object complaining about no index pathRails:form_for 活动记录对象抱怨没有索引路径
【发布时间】:2013-06-03 02:17:16
【问题描述】:

我有一个没有索引页面的调查模型。我只想要这个模型的编辑视图,但似乎 rails 不会让我这样做。当我尝试使用form_for(@survey) 时,它会抱怨undefined method surveys_path。无论如何,在不创建空索引路由/视图的情况下这样做吗?

这是我目前的调查控制器

class SurveysController < ApplicationController

  def show
    @survey = Survey.find(params[:id])

  end

  def edit
    @survey = Survey.new
    job = Job.find(params[:id])
    @survey.job_id = job.id
    authorized_user = job.user
    unless !is_runner?(current_login) && current_login.id == authorized_user.id
        redirect_to jobs_path
    end
  end

  def update
    @survey = Survey.new(params[:survey])

  end

end

这是在edit.html.erb中呈现的部分表单

<%= form_for(@survey) do |f| %>
  <div class="field">
    <%= f.label :speed %><br />
    <%= f.text_field :speed %>
  </div>
  <div class="field">
    <%= f.label :service %><br />
    <%= f.text_field :service %>
  </div>
  <div class="field">
    <%= f.label :suggestion %><br />
    <%= f.text_area :suggestion %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

【问题讨论】:

  • 你可以试试这个:form_for @survey, :url =&gt; survey_path(@post), :method =&gt; :put do... 吗?
  • 我收到此错误No route matches {:action=&gt;"show", :controller=&gt;"surveys", :id=&gt;nil}
  • 您能发布您的路线吗?

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


【解决方案1】:

它不应该仅仅为了定义一个表单而询问surveys_path,但是你的控制器代码中有一些奇怪的地方可能会让你感到悲伤。

  1. 您的编辑操作应该在 RESTful 应用程序的调查控制器中使用该参数 [:id] 来查找现有调查,为什么会找到工作?它应该和你的表演动作一样。
  2. 调查编辑方法中的调查对象是新的且未保存,因此表单构建器将生成一个指向创建操作而不是更新操作的表单。表单生成器将仅为persisted? 的记录生成编辑表单

您是否为此模型定义了路线?你的路由文件中应该有如下内容:

resources :surveys, :except => [:index] # will create all rest routes for survey model except for an index route.

【讨论】:

    【解决方案2】:

    如果您错误地将模型/表格运行为复数而不是单数,则会出现此错误。你可能会这样运行:

    rails generate model surveys
    

    而不是这个:

    rails generate model survey
    

    所以,如果你运行:

    rake routes
    

    您可能会看到所有路线都有一个“s”即。调查_新。

    所以,rails 很困惑。您需要在迁移中重命名表。

    class ChangePluralNametoSingularforSurveys< ActiveRecord:Migration
      def change
        rename_table :surveys, :survey
      end 
    end
    

    然后您必须手动重命名文件(surveys.rb 等)。

    【讨论】:

      【解决方案3】:

      对我来说,问题在于嵌套路由。如果您的对象有父对象并且其路由是嵌套的,则您需要执行以下操作:

      <%= form_for([@category, @survey]) do |f| %>
        ...
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 2014-09-20
        • 2016-08-31
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多