首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >路由错误:没有路由匹配[POST] "/flex_quiz/new“

路由错误:没有路由匹配[POST] "/flex_quiz/new“
EN

Stack Overflow用户
提问于 2016-04-30 13:30:49
回答 2查看 829关注 0票数 0

在我的rails应用程序中,我试图使用一个表单分部在newedit视图上显示相同的测试。我可以看到新的视图页面,但是当我点击<%= f.submit "Submit Answers" %>时,我看到了一个错误:No route matches [POST] "/flex_quiz/new"

下面是我的部分中的form for行:

代码语言:javascript
复制
<%= form_for @flex_quiz, url: url do |f| %>

这里是当地人在我的new视图中的立场:

代码语言:javascript
复制
 <%= render partial: "quiz", locals: { url: new_flex_quiz_path, method: :post } %>

我的edit观点是:

代码语言:javascript
复制
<%= render "quiz", url: edit_flex_quiz_path(@flex_quiz), method: :put  %>

以下是路线:

代码语言:javascript
复制
         Prefix Verb   URI Pattern                    Controller#Action
            ...     
flex_quiz_index GET    /flex_quiz(.:format)           flex_quiz#index
                POST   /flex_quiz(.:format)           flex_quiz#create
  new_flex_quiz GET    /flex_quiz/new(.:format)       flex_quiz#new
 edit_flex_quiz GET    /flex_quiz/:id/edit(.:format)  flex_quiz#edit
      flex_quiz GET    /flex_quiz/:id(.:format)       flex_quiz#show
                PATCH  /flex_quiz/:id(.:format)       flex_quiz#update
                PUT    /flex_quiz/:id(.:format)       flex_quiz#update
                DELETE /flex_quiz/:id(.:format)       flex_quiz#destroy

有人能建议怎么解决这个问题吗?我看过几个类似的帖子(比如),但是由于我使用的是部分,所以这里的解决方案可能会有所不同。

编辑

以下是我在flex_quiz_controller中的定义

代码语言:javascript
复制
class FlexQuizController < ApplicationController
before_action :require_sign_in

def show
  @flex_quiz = FlexQuiz.find(params[:id])
end

def new
  @flex_quiz = current_user.build_flex_quiz
end

def create
  @flex_quiz = FlexQuiz.new

  @flex_quiz.flex01 = params[:flex_quiz][:flex01]
  @flex_quiz.flex02 = params[:flex_quiz][:flex02]
  @flex_quiz.flex03 = params[:flex_quiz][:flex03]
  @flex_quiz.flex04 = params[:flex_quiz][:flex04]
  @flex_quiz.flex05 = params[:flex_quiz][:flex05]
  @flex_quiz.flex06 = params[:flex_quiz][:flex06]
  @flex_quiz.flex07 = params[:flex_quiz][:flex07]
  @flex_quiz.flex08 = params[:flex_quiz][:flex08]
  @flex_quiz.flex09 = params[:flex_quiz][:flex09]
  @flex_quiz.flex10 = params[:flex_quiz][:flex10]

  @flex_quiz.user = current_user

  if @flex_quiz.save
    flash[:notice] = "Quiz results saved successfully."
    redirect_to user_path(current_user)
  else
    flash[:alert] = "Sorry, your quiz results failed to save."
    redirect_to welcome_index_path
  end
end

def edit
  @flex_quiz = FlexQuiz.find(params[:id])
end

def update
  @flex_quiz = FlexQuiz.find(params[:id])

  @flex_quiz.assign_attributes(flex_quiz_params)

  if @flex_quiz.save
    flash[:notice] = "Post was updated successfully."
    redirect_to user_path(current_user)
  else
    flash.now[:alert] = "There was an error saving the post. Please try again."
    redirect_to welcome_index_path
  end
end

private
def flex_quiz_params
  params.require(:flex_quiz).permit(:flex01, :flex02, :flex03, :flex04, :flex05, :flex06, :flex07, :flex08, :flex09, :flex10)
end

end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-30 13:37:30

如果您想要创建新的flex_quiz对象,那么就需要POSTflex_quiz_index_path

注意,在路由路径中,如果您查看new_flex_quiz,HTTP谓词是一个GET

这可能有点不直观,但new操作实际上是一个GET请求。

应该在其中创建对象的操作是create操作。

因此,要解决您的问题,这应该是有用的:

代码语言:javascript
复制
<%= render partial: "quiz", locals: { url: flex_quiz_index_path, method: :post } %>

编辑

  1. 不必定义局部变量,只需在form_for中将表单定义为这样:

您还必须在控制器操作中定义@flex_quiz (在您的示例中是newedit),form_for将自动推断适当的URL。

来自文档

但是,如果传递给form_for的记录是资源,则可以进一步简化,即它对应于一组RESTful路由,例如,使用config/routeres.rb中的资源方法定义的。在这种情况下,Rails只需从记录本身推断出适当的URL。

  1. 您还需要将命名从单数形式改为复数.
票数 4
EN

Stack Overflow用户

发布于 2016-04-30 14:46:04

rails要做的可修复形式是:

app/views/flex_quiz/_form.html.erb:

代码语言:javascript
复制
<%= form_for(@flex_quiz) do |f| %>
  # ...
<% end %>

app/views/flex_quiz/new.erb:

代码语言:javascript
复制
<h1>Create a new quiz</h1>
<%= render 'form' %>

app/views/flex_quiz/edit.erb.app:

代码语言:javascript
复制
<h1>Edit a quiz</h1>
<%= render 'form' %>

虽然使用当地人通常是个好主意,但这里不需要这样做。注意,我们只是将资源传递给form_for,而不是将一个URL传递给Rails --这是操作中的约定而不是配置,也是Rails令人敬畏的原因。

Rails自行确定要为action属性使用什么URL,以及根据资源是否已被保存而使用的方法。

然而,要想让它发挥作用,您实际上要遵循惯例。确保您使用的是正确的复数形式(测验的复数形式是测验。):

代码语言:javascript
复制
resources :flex_quizzes

class FlexQuizzesController < ApplicationController
end

不幸的是,当涉及到您的设置的其余部分时,您需要重新检查绘图板。认为你可以用一个单一的模型来完成这个任务是不现实的。你通常会有几个有关系的模型:

代码语言:javascript
复制
class Quiz
  has_many :questions
end

class Question
  belongs_to :quiz
  has_many :answers
end

class Answer
  belongs_to :question
end

class UserQuiz
  belongs_to :user
  belongs_to :quiz
end

class UserAnswer
  belongs_to :question
  belongs_to :answer
end

您可以使用一个或多个控制器让管理员创建查询,使用单独的控制器让用户回答问题。这是一个相当常见的领域,所以您应该能够找到大量的例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36955538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档