Donc, je suis toujours un Rails noob alors je vais peut-être complètement à tort, mais j'ai deux contrôleurs. Un contrôleur de question et un contrôleur de réponse. J'essaie de créer une fonction de notation qui permet à un utilisateur admin d'assigner des points à des questions à développement. J'utilise le /answer/:id
pour être où: id est l'identifiant de la question et ensuite rendre un partiel pour parcourir toutes les réponses pour cet identifiant. Clair comme de la boue, je suis sûr ...Problème de routage après la mise à jour
Mon problème: Dans le partiel où la réponse de l'utilisateur est affichée, j'ai un formulaire qui permet à l'administrateur de remplir le nombre de points pour cette réponse et soumettre. Idéalement, je voudrais passer à la page suivante (en utilisant will_paginate), mais au moins, j'aimerais rester sur la même page. Je suis capable de faire fonctionner le formulaire mais il continue à aller à/answers /: id mais où: id est l'identifiant de la réponse individuelle, donc pas ce que j'espère.
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 (partiel qui est rendue sur la page d'affichage qui contient le formulaire)
<% @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 %>
de 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
Je suis sûr qu'il y a une solution simple ici (ou peut-être que ça change la façon dont j'ai les choses en place ...). Toute aide est grandement appréciée!
APRÈS RÉTROACTION: Ajout du modèle de catégories et établissement d'une relation directe avec les questions.
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
Questions/show.html.erb
...
<h3>Show answers</h3>
<%= render @answers, locals: {question: @question} %>
<%= will_paginate @answers, renderer: BootstrapPagination::Rails %>
Je ne suis pas 100% clair sur la question, mais '<% = form_for réponse à distance: true fais | f | %> 'pourrait être ce que vous cherchez, cela empêchera un lien vers une nouvelle URL. –