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 %>
3 Réponses :
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.
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
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")?
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 %>
avez-vous essayé
./bin/rails routespour lister toutes les routes disponibles et voir siuser_goals_pathpointe versusers # 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.rbpour mieux comprendre comment vous définissez les itinéraires?@LucasK Merci, posté!
@Gabbar Merci, posté!
@thebot Vous avez une faute de frappe.
user_goals_pathdoit êtreuser_goal_pathsi 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 .