Итак, я все еще Rails noob, поэтому я могу полностью ошибиться, но у меня есть два контроллера. Контроллер вопросов и контроллер ответов. Я пытаюсь создать функцию оценки, которая позволяет пользователю администратора назначать вопросы для эссе. Я использую /answer/:id
, где: id - это идентификатор вопроса, а затем рендеринг частичного итерации всех ответов для этого идентификатора. Ясно, как грязь Я уверен ...Проблема маршрутизации после обновления
Моя проблема: в частичном, где отображается ответ пользователя, у меня есть форма, которая позволяет администратору заполнить количество баллов для этого ответа и отправить. В идеале я хотел бы перейти на следующую страницу (используя will_paginate), но, как минимум, я хотел бы остаться на одной странице. Я могу получить форму, но она продолжает идти/отвечает /: id, но где: id - это идентификатор индивидуального ответа, а не то, что я надеюсь.
answers_controller.rb
class AnswersController < ApplicationController
def index
@user = current_user
@questions = Question.all
end
def show
@user = current_user
@question = Question.find(params[:id])
@answers = Answer.where("question_id = ?", @question.id).paginate(:page => params[:page], :per_page => 1)
@answer = Answer.where("question_id =? AND user_id = ?", @question.id, @user.id)
end
def edit
@answer = Answer.find(params[:id])
end
def update
@answer = Answer.find(params[:id])
if @answer.update_attributes(grade_params)
flash[:success] = "Answer Graded"
else
flash[:warning] = "Not Graded"
end
end
private
def grade_params
params.require(:answer).permit(:points_earned)
end
end
_essay_grades.html.erb (частичный, подлежащего визуализации на шоу странице, которая содержит форму)
<% @answers.each do |answer| %>
<p>User: <%= answer.user_id %></p>
<%= answer.answer %><br>
<%= @question.value %>
<br>
<%= form_for(answer) do |f| %>
<%#= f.radio_button :points_earned, @question.value %><br>
<%#= f.radio_button :points_earned, 0 %> <br>
<%= f.text_field :points_earned %> Points<br>
<br>
<%= f.submit "Award Points" %>
<% end %>
<% end %>
<br>
<br>
<%= will_paginate @answers, renderer: BootstrapPagination::Rails %>
routes.rb
Rails.application.routes.draw do
resources :admins, :answers, :static_pages, :questions
devise_for :users, :controllers => { registrations: 'registrations' },
:path => '', :path_names =>
{ :sign_in => "login", :sign_up => "register" }
root "static_pages#index"
end
Я уверен, что здесь есть простое решение (или, может быть, оно меняет то, как у меня созданы все ...). Любая помощь очень ценится!
ПОСЛЕ ОБРАТНОЙ СВЯЗИ: Добавлена модель классов и создана взаимосвязь с вопросами.
answer_controller.rb
class AnswersController < ApplicationController
def show
@user = current_user
@question = Question.find(params[:id])
@answers = Answer.where("question_id = ?", @question.id).paginate(:page => params[:page], :per_page => 1)
@answer = Answer.where("question_id =? AND user_id = ?", @question.id, @user.id)
end
def update
@user = current_user
@question = Question.find(params[:question_id])
@answer = @question.answers.find(params[:id])
@grade = @question.grades.new(grade_params)
if @grade.save
flash[:success] = "Answer Graded"
redirect_to @question
end
end
private
def grade_params
params.require(:grade).permit(:user_id, :answer_id, :points_earned, :graded_by, :comment)
end
end
_answer.html.erb
<%= answer.user_id %>
<%= form_tag [@question, answer], method: :put do %>
<%= hidden_field_tag :graded_by, current_user.id %>
<%= hidden_field_tag :answer_id, answer.id %>
<%= number_field_tag :points_earned %>
<%= submit_tag "Submit Grade" %>
<% end %>
routes.rb
Rails.application.routes.draw do
resources :questions do
resources :answers, only: [:update]
end
resources :admins, :static_pages
вопросы/show.html.erb
...
<h3>Show answers</h3>
<%= render @answers, locals: {question: @question} %>
<%= will_paginate @answers, renderer: BootstrapPagination::Rails %>
Я не 100% ясно по этому вопросу, но '<% = form_for ответа, удаленный: истинные do | f | %> 'может быть то, что вы ищете, это предотвратит ссылку на новый URL-адрес. –