在我的rails应用程序中,我试图使用一个表单分部在new和edit视图上显示相同的测试。我可以看到新的视图页面,但是当我点击<%= f.submit "Submit Answers" %>时,我看到了一个错误:No route matches [POST] "/flex_quiz/new"。
下面是我的部分中的form for行:
<%= form_for @flex_quiz, url: url do |f| %>这里是当地人在我的new视图中的立场:
<%= render partial: "quiz", locals: { url: new_flex_quiz_path, method: :post } %>我的edit观点是:
<%= render "quiz", url: edit_flex_quiz_path(@flex_quiz), method: :put %>以下是路线:
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中的定义
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发布于 2016-04-30 13:37:30
如果您想要创建新的flex_quiz对象,那么就需要POST到flex_quiz_index_path。
注意,在路由路径中,如果您查看new_flex_quiz,HTTP谓词是一个GET。
这可能有点不直观,但new操作实际上是一个GET请求。
应该在其中创建对象的操作是create操作。
因此,要解决您的问题,这应该是有用的:
<%= render partial: "quiz", locals: { url: flex_quiz_index_path, method: :post } %>编辑:
form_for中将表单定义为这样:您还必须在控制器操作中定义@flex_quiz (在您的示例中是new和edit),form_for将自动推断适当的URL。
来自文档:
但是,如果传递给form_for的记录是资源,则可以进一步简化,即它对应于一组RESTful路由,例如,使用config/routeres.rb中的资源方法定义的。在这种情况下,Rails只需从记录本身推断出适当的URL。
发布于 2016-04-30 14:46:04
rails要做的可修复形式是:
app/views/flex_quiz/_form.html.erb:
<%= form_for(@flex_quiz) do |f| %>
# ...
<% end %>app/views/flex_quiz/new.erb:
<h1>Create a new quiz</h1>
<%= render 'form' %>app/views/flex_quiz/edit.erb.app:
<h1>Edit a quiz</h1>
<%= render 'form' %>虽然使用当地人通常是个好主意,但这里不需要这样做。注意,我们只是将资源传递给form_for,而不是将一个URL传递给Rails --这是操作中的约定而不是配置,也是Rails令人敬畏的原因。
Rails自行确定要为action属性使用什么URL,以及根据资源是否已被保存而使用的方法。
然而,要想让它发挥作用,您实际上要遵循惯例。确保您使用的是正确的复数形式(测验的复数形式是测验。):
resources :flex_quizzes
class FlexQuizzesController < ApplicationController
end不幸的是,当涉及到您的设置的其余部分时,您需要重新检查绘图板。认为你可以用一个单一的模型来完成这个任务是不现实的。你通常会有几个有关系的模型:
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您可以使用一个或多个控制器让管理员创建查询,使用单独的控制器让用户回答问题。这是一个相当常见的领域,所以您应该能够找到大量的例子。
https://stackoverflow.com/questions/36955538
复制相似问题