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
3 Réponses :
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
Je pense qu'il veut des itinéraires imbriqués.
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| %>
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 :(
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.
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.