Je suis un peu nouveau sur Rails, et j'apprends un tutoriel en ligne. Le gars dans les vidéos a expliqué comment vous devez avoir une instruction if pour décider si la sauvegarde a fonctionné ou non.

Voici mon code:

def create
  @quiz = Quiz.new(quiz_params)
  if @quiz.save
    flash[:notice] = "Your quiz has been created."
    redirect_to action: 'index'
  else
   render('new')
  end
end

Le quiz_params a été défini comme tel:

params.require(:quiz).permit(:title, :summary, :visible)

Pour une raison quelconque, il refuse de rediriger vers la fonction d'index, décidant de rester sur la même page pendant que l'URL passe de localhost:3000/quizzes/new à localhost:3000/quizzes.

Le gars qui a enseigné le tutoriel avait ce code.

def create
  @subject = Subject.new(subject_params)
  if @subject.save
    flash[:notice] = "Subject created succesfully."
    redirect_to(subjects_path)
  else
    render('new')
  end
end

Le subject_params est allé comme tel:

 params.require(:subject).permit(:name, :position, :visible)

À part le libellé des guillemets et le nom du modèle et des variables, je ne sais pas quelle est la différence. Je suis aussi cohérent que possible, donc il ne devrait pas y avoir de différence.

Désolé si le formatage est mauvais.

0
Jraokmepala 31 déc. 2017 à 07:01

5 réponses

Meilleure réponse

Vous pouvez exécuter rake routes sur votre command prompt puis ils verront ce qu'est le index_path si vous arrivez à redirect sur la page d'accueil puis écrivez

redirect_to root_path #=> Or root_url

Ou si votre contrôleur est QuizzesController, votre chemin index est quizzes_path

redirect_to quizzes_path #=> Use instead of redirect_to action: 'index'

Ou si vous avez articles/index alors

redirect_to articles_path

Au plaisir d'aider

0
fool-dev 31 déc. 2017 à 04:44

Vous devriez nous dire la version Rails et Ruby. Quoi qu'il en soit, j'utilise Rails 5+ et je pense que la syntaxe

Render('new') 

Est ancien ou obsolète. Voici ce que je fais habituellement.

def create
    plan = Plan.new plan_params
    plan.delivered = 0
    plan.user_id = params['u_id']
    if plan.save
      flash[:OK] = 'Il nuovo piano e\' stato salvato con successo!'
    else
      flash[:err] = 'Siamo spiacenti ma non siamo riusciti a registrare il tuo piano, ricontrolla i dati inseriti!'
      flash[:errors] = plan.errors.messages
    end
    redirect_to plans_users_path(User.find(params['u_id']))
end

Donc, mon conseil est d'essayer d'utiliser des chemins nommés au lieu de chaînes.

0
puneet18 2 janv. 2018 à 12:20

Votre validation échoue et affiche une «nouvelle» vue. tandis que l'action reste à créer.

Si vous voyez des routes râteau, cette route correspond à localhost: 3000 / quiz pour créer une action.

Vous pouvez vous référer cette réponse pour plus de détails.

0
Rahul Sharma 31 déc. 2017 à 04:39

Vous pouvez utiliser byebug pour déboguer la requête et voir si le code appelle redirect_to ou pas. cela pourrait être une forme ajax comme l'a dit @fool. vérifiez l'objet de formulaire dans la vue s'il a l'attribut remote: true, supprimez-le et réessayez.

0
Mohamed Elfiky 1 janv. 2018 à 20:01

Changez ci-dessous la ligne dans le contrôleur:

redirect_to action: 'index'

Avec

redirect_to "/quizzes"

Donc, le code est comme:

def create
  @quiz = Quiz.new(quiz_params)
  if @quiz.save
    redirect_to "/quizzes", notice: "Your quiz has been created."
  else
   render 'new'
  end
end
0
puneet18 2 janv. 2018 à 12:18