0
votes

Comment réparer "la mise à jour d'un commentaire m'a envoyé sur la mauvaise route"

Je suis en train de créer une application et j'ai un contrôleur d'utilisateur de périphérique, pour me connecter avec l'échafaudage de commentaire et de publication. Mon problème est que lorsque je mets à jour un commentaire et clique sur le bouton Mettre à jour, il m'envoie sur la route http: // localhost: 3000 / publicaciones / 1 / comentarios quand je l'ai dit dans le contrôleur d'envoyer moi à http: // localhost: 3000 / publicaciones / 1 .

La pensée de création et de suppression m'envoie vers les routes correctes

contrôleur mensajes

<%= form_with(model: @comentario, url: publicacione_comentarios_path, local: true) do |form| %>
  <% if comentario.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(comentario.errors.count, "error") %> prohibited this comentario from being saved:</h2>

      <ul>
      <% comentario.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :contenido %>
    <%= form.text_field :contenido %>
  </div>

  <div class="field">
    <%= form.label :puntaje_reputacion %>
    <%= form.text_field :puntaje_reputacion %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

publicaciones controller

<h1>Editing Comentario</h1>

<%= render 'form', comentario: @comentario %>

<%= link_to 'Show', publicacione_comentario_path%> |
<%= link_to 'Back', publicacione_path(@comentario.publicacione_id) %>

confit / routes

Rails.application.routes.draw do
  resources :publicaciones do
    resources :comentarios
  end
  resources :cursos
  resources :eventos
  resources :sala_de_estudios
  devise_for :users
  resources :campus
  resources :users, only: [:show, :edit, :update]
  root 'campus#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

modifier la vue

class PublicacionesController < ApplicationController
  before_action :set_publicacione, only: [:show, :edit, :update, :destroy]
  # GET /publicaciones
  # GET /publicaciones.json
  def index
    @publicaciones = Publicacione.all
  end

  # GET /publicaciones/1
  # GET /publicaciones/1.json
  def show
  end

  # GET /publicaciones/new
  def new
    @publicacione = Publicacione.new
  end

  # GET /publicaciones/1/edit
  def edit
  end

  # POST /publicaciones
  # POST /publicaciones.json
  def create
    @publicacione = Publicacione.new(publicacione_params)

    respond_to do |format|
      if @publicacione.save
        format.html { redirect_to @publicacione, notice: 'Publicacione was successfully created.' }
        format.json { render :show, status: :created, location: @publicacione }
      else
        format.html { render :new }
        format.json { render json: @publicacione.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /publicaciones/1
  # PATCH/PUT /publicaciones/1.json
  def update
    respond_to do |format|
      if @publicacione.update(publicacione_params)
        format.html { redirect_to @publicacione, notice: 'Publicacione was successfully updated.' }
        format.json { render :show, status: :ok, location: @publicacione }
      else
        format.html { render :edit }
        format.json { render json: @publicacione.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /publicaciones/1
  # DELETE /publicaciones/1.json
  def destroy
    @publicacione.destroy
    respond_to do |format|
      format.html { redirect_to publicaciones_url, notice: 'Publicacione was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_publicacione
      @publicacione = Publicacione.find(params[:id])
    end

    def set_comentarios
      @comentarios = Comentario.all
    end
    # Never trust parameters from the scary internet, only allow the white list through.
    def publicacione_params
      params.require(:publicacione).permit(:titulo, :contenido, :descripcion, :puntaje_reputacion, :user_id, :curso_id)
    end
end

Vue formulaire

before_action :set_comentario, only: [:show, :edit, :update, :destroy]
  before_action :set_publicacione, only: [:new, :create, :destroy, :show]

  # GET /comentarios
  # GET /comentarios.json
  def index
    @comentarios = Comentario.all
  end

  # GET /comentarios/1
  # GET /comentarios/1.json
  def show
  end

  # GET /comentarios/new
  def new
    @comentario = Comentario.new
  end

  # GET /comentarios/1/edit
  def edit
  end

  # POST /comentarios
  # POST /comentarios.json
  def create
    @comentario = Comentario.new(comentario_params)
    @comentario.publicacione_id = @publicacione.id
    @comentario.user_id = current_user.id
    respond_to do |format|
      if @comentario.save
        format.html { redirect_to publicacione_path(@publicacione), notice: 'Comentario was successfully created.' }
        format.json { render :show, status: :created, location: @comentario }
      else
        format.html { render :new }
        format.json { render json: @comentario.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /comentarios/1
  # PATCH/PUT /comentarios/1.json
  def update
    respond_to do |format|
      if @comentario.update(comentario_params)
        format.html { redirect_to publicacione_path(@comentario.publicacione_id), notice: 'Comentario was successfully updated.' }
        format.json { render :show, status: :ok, location: publicacione_path(@comentario.publicacione_id) }
      else
        format.html { render :edit }
        format.json { render json: @comentario.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /comentarios/1
  # DELETE /comentarios/1.json
  def destroy
    @comentario.destroy
    respond_to do |format|
      format.html { redirect_to publicacione_path(@comentario.publicacione_id), notice: 'Comentario was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_comentario
      @comentario = Comentario.find(params[:id])
    end

    def set_publicacione
      @publicacione = Publicacione.find(params[:publicacione_id])
    end
    # Never trust parameters from the scary internet, only allow the white list through.
    def comentario_params
      params.require(:comentario).permit(:contenido, :puntaje_reputacion, :user_id, :publicacione_id)
    end
end

Lorsque je clique dessus, envoyez-moi à http: // localhost: 3000 / publicaciones / 1 / comentarios mais http: // localhost: 3000 / publicaciones / 1 était attendu


0 commentaires

3 Réponses :


0
votes

Vous avez des routes imbriquées

resources :publicaciones do
  resources :comentarios, shallow: true
end

Vous pouvez les abandonner.

resources :publicaciones
resources :comentarios

Vous pouvez également utiliser shallow

resources :publicaciones do
  resources :comentarios
end


1 commentaires

Je pense qu'il veut des itinéraires imbriqués.



0
votes

Puisque vous avez des ressources imbriquées, vous devez définir l'objet Publicacione sur le formulaire:

  def update
    respond_to do |format|
      if @comentario.update(comentario_params)
        format.html { redirect_to publicacione_path(@publicacione), notice: 'Comentario was successfully updated.' }
        format.json { render :show, status: :ok, location: publicacione_path(@comentario.publicacione_id) }
      else
        format.html { render :edit }
        format.json { render json: @comentario.errors, status: :unprocessable_entity }
      end
    end
  end

  private

    def set_comentario
      @comentario = @publicacione.comentarios.find(params[:id])
    end

Ensuite, dans le contrôleur, vous devez définir @commentario basé sur @publicacione et redirect_to publicacione_path (@publicacione) :

<%= form_with(model: @comentario, url: publicacione_comentarios_path(@publicacione), local: true) do |form| %>


5 commentaires

ne semble pas aller, je pense que le problème mu est que lorsque je frappe la mise à jour, il ne va pas à la mise à jour de la fonction, y a-t-il un moyen de tester cela? changé toutes les choses que vous avez dites mais les comportements sont toujours les mêmes, cela m'envoie sur la route si j'aurais redirigé vers @comment, quand il ne dit pas que


Oui, le moyen le plus simple est simplement d'ajouter quelque chose comme «booom» right def update . Les meilleures options sont log.debug ('im here') et byebug . Ce dernier arrêtera l'exécution et affichera un débogueur dans la commande rails s .


appelé byebug et n'apparaît pas dans le débogueur, je pense vraiment qu'il ne va pas à la fonction de mise à jour. également dans la console apparaissent ce bug PATCH démarré "/ publicaciones / 1 / comentarios" pour 172.19.0.1 à 2019-04-27 16:57:39 +0000 web_1 | Impossible de rendre la console à partir de 172.19.0.1! Réseaux autorisés: 127.0.0.1, :: 1, 127.0.0.0/127.255.255.255 peut-être est-ce utile, une idée de ce qui pourrait empêcher la mise à jour de la fonction?


Démarrez le serveur avec rails s -b 0.0.0.0 pour accepter la requête de chaque IP.


Ok, essayez, le problème est que l'erreur est la même lors de l'exécution sur heroku, l'exécution du serveur avec des rails s -b 0.0.0.0 ne fonctionne pas :(



0
votes

Ceci

form_with(model: @comentario, url: [@publicacione, @comentario], local: true)

Est correct pour new / create mais pour modifier / mettre à jour cela devrait être ...

<%= form_with(model: @comentario, url: publicacione_comentario_path(@publicacione, @comentario), local: true) do |form| %>

Si vous ne le faites pas Je ne veux pas avoir des formes différentes pour les deux conditions (et je ne vous en veux pas) utilisez le format ...

<%= form_with(model: @comentario, url: publicacione_comentarios_path, local: true) do |form| %>

... puis le La méthode d'assistance form_with générera le chemin correct.


2 commentaires

Merci pour la réponse, c'est ce que je l'ai réparé pour moi. pouvez-vous m'expliquer pourquoi cette différence existe entre les deux formes?


C'est parce que le chemin RESTful pour mettre à jour un enregistrement est différent de celui pour créer un enregistrement (vous pouvez google REST apis) et rails fait un bon travail pour déterminer ce qui est nécessaire lors de la création d'un formulaire en fonction de si l'objet de formulaire est #new_record? ou #persisted? mais lorsque vous fournissez explicitement un chemin, cela remplace les valeurs par défaut des rails.