Controlador para aulas y estudiantes -- ruby campo con ruby-on-rails campo con controller campo con rest camp codereview Relacionados El problema

Controller for classrooms and students


6
vote

problema

Español

Las acciones en las que me estoy preguntando son members , add_student1 y remove_student . Trabajan bien, pero no están tranquilizados y se siente como se deben manejar (quizás) por el StudentsController .

NOTA QUE members y show son iguales. La única diferencia es que el members.html.erb665544336 se muestra @classroom.students Mientras show.html.erb muestra información sobre el aula en sí.

  class ClassroomsController < ApplicationController    # GET /classrooms   def index     @classrooms = Classroom.all.order('name ASC')   end    # GET /classrooms/1   def show     @classroom = Classroom.find(params[:id])      authorize @classroom   end    # GET /classrooms/1/members   def members     @classroom = Classroom.find(params[:id])      authorize @classroom   end    # GET /classrooms/new   def new     @classroom = Classroom.new     @classroom.build_avatar      authorize @classroom   end    # GET /classrooms/1/edit   def edit     @classroom = Classroom.find(params[:id])     @classroom.build_avatar unless @classroom.avatar      authorize @classroom   end    # POST /classrooms   def create     @classroom = Classroom.new(classroom_params)      authorize @classroom      if @classroom.save       redirect_to classrooms_path, notice: 'Classroom was successfully created.'     else       render action: "new"     end   end    # PUT /classrooms/1   def update     @classroom = Classroom.find(params[:id])      authorize @classroom      if @classroom.update(classroom_params)       redirect_to edit_classroom_path(@classroom), notice: 'Classroom was successfully updated.'     else       render action: "edit"     end   end    def add_student     @classroom = Classroom.find(params[:id])     @student = Student.find(params[:classroom][:student_ids][0])      authorize @classroom      @classroom.students << @student      respond_to do |format|       @count = @classroom.students.count       format.js     end   end    def remove_student     @classroom = Classroom.find(params[:id])     @student = Student.find(params[:classroom][:student_ids][0])      authorize @classroom      @classroom.students.delete(@student)      respond_to do |format|       @count = @classroom.students.count       format.js     end   end    # DELETE /classrooms/1   def destroy     @classroom = Classroom.find(params[:id])      authorize @classroom      @classroom.destroy      redirect_to classrooms_path   end    private    def classroom_params     params.require(:classroom).permit(:name, :description, avatar_attributes: [:id, :avatar, :_destroy],       :student_ids => [])   end  end   

Aquí están los modelos:

  add_student0  
Original en ingles

The actions I'm wondering about are members, add_student, and remove_student. They work just fine, but they aren't RESTful and it feels like they should be handled (perhaps) by the StudentsController.

Note that members and show are the same. The only difference is that the members.html.erb view iterates over and displays @classroom.students while show.html.erb displays info about the classroom itself.

class ClassroomsController < ApplicationController    # GET /classrooms   def index     @classrooms = Classroom.all.order('name ASC')   end    # GET /classrooms/1   def show     @classroom = Classroom.find(params[:id])      authorize @classroom   end    # GET /classrooms/1/members   def members     @classroom = Classroom.find(params[:id])      authorize @classroom   end    # GET /classrooms/new   def new     @classroom = Classroom.new     @classroom.build_avatar      authorize @classroom   end    # GET /classrooms/1/edit   def edit     @classroom = Classroom.find(params[:id])     @classroom.build_avatar unless @classroom.avatar      authorize @classroom   end    # POST /classrooms   def create     @classroom = Classroom.new(classroom_params)      authorize @classroom      if @classroom.save       redirect_to classrooms_path, notice: 'Classroom was successfully created.'     else       render action: "new"     end   end    # PUT /classrooms/1   def update     @classroom = Classroom.find(params[:id])      authorize @classroom      if @classroom.update(classroom_params)       redirect_to edit_classroom_path(@classroom), notice: 'Classroom was successfully updated.'     else       render action: "edit"     end   end    def add_student     @classroom = Classroom.find(params[:id])     @student = Student.find(params[:classroom][:student_ids][0])      authorize @classroom      @classroom.students << @student      respond_to do |format|       @count = @classroom.students.count       format.js     end   end    def remove_student     @classroom = Classroom.find(params[:id])     @student = Student.find(params[:classroom][:student_ids][0])      authorize @classroom      @classroom.students.delete(@student)      respond_to do |format|       @count = @classroom.students.count       format.js     end   end    # DELETE /classrooms/1   def destroy     @classroom = Classroom.find(params[:id])      authorize @classroom      @classroom.destroy      redirect_to classrooms_path   end    private    def classroom_params     params.require(:classroom).permit(:name, :description, avatar_attributes: [:id, :avatar, :_destroy],       :student_ids => [])   end  end 

Here are the models:

# student.rb class Student < ActiveRecord::Base   has_many :classroom_memberships, :dependent => :destroy, :inverse_of => :student   has_many :classrooms, :through => :classroom_memberships end  # classroom.rb class Classroom < ActiveRecord::Base   has_many :classroom_memberships, :inverse_of => :classroom, :dependent => :destroy   has_many :munchkins, :through => :classroom_memberships end 
           

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Las acciones en las que me estoy preguntando son miembros, ADD_STUDENTE y REMOTE_STUDENTE. Trabajan bien, pero no son tranquilos [...]

True, no son parte las acciones de crud habituales que se pueden expresar con verbos HTTP. Pero entonces tampoco lo es el valor predeterminado new edit1 Acciones, por lo que no es como ir más allá de Crud es automáticamente ilegal.

Aun así, las asociaciones siempre presentan un poco de desafío. ¿Está agregando al estudiante a la clase, o la clase al estudiante?

Sin embargo, en este caso parece que ya tiene un modelo de unión: ClassroomMembership . Así que regrese a las acciones de CRUD, considere qué está creando cuando llame add_student : una membresía.

Entonces, lo que quiera querer hacer es simplemente hacer un 9988776665544334 , ya que ese es el recurso que está manipulando. Dicho controlador puede entonces tener las acciones de crud de descanso habituales, manteniendo StudentsController o ClassroomController bastante limpio.

Esto es solo una idea, sin embargo. Nuevamente, si es más sencillo mantener sus acciones en el ClassroomController , haga eso. Pero conceptualmente lo que estás haciendo es manipular el modelo de asociación.

 

The actions I'm wondering about are members, add_student, and remove_student. They work just fine, but they aren't RESTful [...]

True, they're not part the usual CRUD actions that can be expressed with HTTP verbs. But then neither are the default new or edit actions, so it's not like going beyond CRUD is automatically illegal.

Even so, associations do always present a bit of challenge. Are you adding the student to the class, or the class to the student?

However, in this case it appears that you already have a join model: ClassroomMembership. So going back to the CRUD actions, consider what you're creating when you call add_student: A membership.

So what you might want to do is simply make a ClassroomMembershipsController, since that's the resource you're manipulating. Said controller can then have the usual RESTful CRUD actions, keeping StudentsController or ClassroomController pretty clean.

This is just an idea, though. Again, if it's simpler to keep your actions on the ClassroomController then do that. But conceptually what you're doing is manipulating the association model.

 
 
       
       
3
 
vote

Puede refactor add_student y remove_student usando bloques

  edit0  

Esto simplemente está tirando de su código dentro de algunas otras acciones.

 

You could refactor add_student and remove_student using blocks

  def add_student     find_class_and_student do       @classroom.students << @student           end   end    def remove_student     find_class_and_student do       @classroom.students.delete(@student)     end   end    private    def find_class_and_student      @classroom = Classroom.find(params[:id])      @student = Student.find(params[:classroom][:student_ids][0])              authorize @classroom       yield       respond_to do |format|         @count = @classroom.students.count         format.js      end      end 

This is just pulling your code inside some other actions.

 
 

Relacionados problema

2  Biblioteca cliente basada en rizos (Ronda 2)  ( Curl based rest client library round 2 ) 
Esta es una segunda iteración en una revisión anterior: Biblioteca de clientes de REST basada en rizo He hecho algunas refactorizaciones para dividir la r...

6  Ejecutando una URL usando RESTTEMPLA  ( Executing a url using resttemplate ) 
Estoy trabajando en un proyecto en el que construyo una URL con un nombre de host válido (pero no un nombre de host bloqueado) y luego ejecute esa URL usando ...

3  Mini HTTPCLIENT JSON POST POR PARÁMETRO DE ACCIÓN  ( Mini httpclient json post by action parameter ) 
Esta es una implementación de HTTPClient JSON POST POST POR PARÁMETRO. lógica: Es muy conveniente pasar la URL y el objeto (convertido automáticamente...

3  Biblioteca de clientes basados ​​en curl  ( Curl based rest client library ) 
Recientemente he refactorado una biblioteca de clientes de descanso y esperaba obtener una revisión tanto para la clase como las pruebas de la unidad que lo c...

2  PHP / PHALCON API API API  ( Php phalcon restful api architecture ) 
Estoy construyendo una API RESTFULT en PHP con el marco de Falcon. La API consistirá en múltiples módulos (por ejemplo, api.example.com/mail/users, api.exampl...

3  Biblioteca de Wrapper Perl (escrito usando Moose) para una API de descanso  ( Perl wrapper library written using moose for a rest api ) 
Escribí una biblioteca de envoltura para una API de descanso en Perl usando la Biblioteca Moose. Me gustaría reunir algunos comentarios sobre ella (principalm...

3  PHP API API para un repositorio de estudiantes  ( Php restful api for a student repository ) 
Todos los códigos se basan en el estándar PSR-2. También se siguen los patrones de inyección y repositorios de dependencia. Me encantaría escuchar algunos con...

2  JavaScript Nodo / Reaction Desarrollador web Código de entrevista Parte 2 API API  ( Javascript node react web developer interview code part 2 restful api ) 
Recientemente solicité un trabajo como un desarrollador de nodos / reaccionar. Estoy intentando cruzar de una posición de investigación al desarrollo web. No ...

3  Una solicitud XMLHTTP en el navegador  ( A xmlhttp request in the browser ) 
Edificio en una Respuesta y un intento de escribir un completo Map1 Ejemplo que cubre todo tipo de errores posibles y devuélvalos a la persona que llama c...

4  AWS EC2 Metadata Fetcher en Python  ( Aws ec2 metadata fetcher in python ) 
Actualización https://docs.aws.amazon .com / AWSEC2 / Último / UserGuide / EC2-instance-metadata.html Este parece ser el esquema para los metadatos de...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos