1
votes

Pourquoi show helper ne mène pas à show.html.erb mais à index.html.erb?

Voici mon code qui cause des problèmes:

  create_table "goals", force: :cascade do |t|
    t.text "text"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "user_id"
    t.index ["user_id"], name: "index_goals_on_user_id"
  end

Je pensais que user_goals_path (@user, @goal) était correct, mais apparemment il continue à aller à index.html.erb.

Mon émission et mon index dans le contrôleur:

No route matches {:action=>"show", :controller=>"goals", :id=>nil, :user_id=>"1"}, missing required keys: [:id]

Toute aide serait très appréciée.

UPDATE:

Merci pour les commentaires. Voici mon itinéraire:

Rails.application.routes.draw do
  devise_for :users

  resources :user do
    resources :goals
  end

  devise_scope :user do
    authenticated :user do
      root 'home#index', as: :authenticated_root
    end

    unauthenticated do
      root 'devise/sessions#new', as: :unauthenticated_root
    end
  end
end

Et route.rb:

               user_goals GET    /user/:user_id/goals(.:format)                                                           goals#index
                          POST   /user/:user_id/goals(.:format)                                                           goals#create
            new_user_goal GET    /user/:user_id/goals/new(.:format)                                                       goals#new
           edit_user_goal GET    /user/:user_id/goals/:id/edit(.:format)                                                  goals#edit
                user_goal GET    /user/:user_id/goals/:id(.:format)                                                       goals#show
                          PATCH  /user/:user_id/goals/:id(.:format)                                                       goals#update
                          PUT    /user/:user_id/goals/:id(.:format)                                                       goals#update
                          DELETE /user/:user_id/goals/:id(.:format)                                                       goals#destroy

Comme mentionné dans le commentaire, user_goal_path (@user, objectif) génère une erreur dans la liste des objectifs:

    def index
        @user = User.find(params[:user_id])
        @goal = @user.goals
    end

    def show
        @user = User.find(params[:user_id])
        @goal = @user.goals.find(params[:id])
    end

MISE À JOUR 2:

Est-ce que cela pourrait être le problème? Voici mon schéma. Voyez-vous quelque chose de mal ici, par rapport à mon objectif de montrer le but?

  <% @user.goals.each do |goal| %>
    <tr>
      <td><%= link_to goal.text, user_goals_path(@user, goal)%></td>
    </tr>
  <% end %>


8 commentaires

avez-vous essayé ./bin/rails routes pour lister toutes les routes disponibles et voir si user_goals_path pointe vers users # show ?


@LucasK Merci. Oui, il indique en fait user_goal pour afficher l'objectif. Mais, bizarrement, user_goal_path (@user, @goal) générera une erreur pour afficher la liste des objectifs. Le message d'erreur: Aucune route ne correspond à {: action => "show",: controller => "buts",: id => nil,: user_id => "1"}, clés requises manquantes: [: id] Donc je ne peux même pas vérifier si cela fonctionnerait.


@thebot Pouvez-vous afficher la sortie de la route sur le terminal en exécutant la commande rake routes | objectifs de grep ?


Pouvez-vous également publier le routes.rb pour mieux comprendre comment vous définissez les itinéraires?


@LucasK Merci, posté!


@Gabbar Merci, posté!


@thebot Vous avez une faute de frappe. user_goals_path doit être user_goal_path si vous voulez qu'il soit dirigé vers l'émission.


Vous pouvez également utiliser emboîtement peu profond , car le guide de routage des rails le dit spécifiquement "Les ressources ne doivent jamais être imbriquées à plus d'un niveau de profondeur." dans la section Ressources imbriquées .


3 Réponses :


0
votes

user_goals_path (@user, goal) ressemble à une route générée automatiquement vers une action: index.

S'il s'agissait d'une action: show, cela aurait probablement été user_goal_path (@user, goal) à la place, pour afficher un objectif utilisateur.

Comme l'a dit Lucas K, la publication de votre sortie rake routes peut vous aider à effectuer un diagnostic plus approfondi.


0 commentaires

0
votes

Pour cette route, il suffit que le paramètre user_id passe dynamiquement

<td><%= link_to goal.text, user_goal_path(@user, @goal)%></td>
<td><%#= link_to goal.text, user_goal_path(@current_user, @goal)%></td>

Donc ce serait

            user_goal GET    /user/:user_id/goals/:id(.:format)     goals#show

Pour les itinéraires, il faut que les paramètres user_id et id passent dynamiquement

<td><%= link_to goal.text, user_goals_path(@user)%></td>
<td><%#= link_to goal.text, user_goals_path(@current_user)%></td>

Donc ce serait

           user_goals GET    /user/:user_id/goals(.:format)     goals#index


1 commentaires

Merci. Cela ne semble pas fonctionner. Mais pensez-vous que le problème pourrait être ce que j'ai publié au bas de mon message ("MISE À JOUR 2")?



0
votes

Après avoir essayé des ressources imbriquées superficielles, je pourrais passer de la liste à la page d'affichage avec ceci:

  <% @user.goals.each do |goal| %>
    <tr>
      <td><%= link_to goal.text, goal_path(@user,goal)%></td>
    </tr>
  <% end %>


0 commentaires