我正在尝试访问我的应用的exercises#index
页面,来自workouts#show
页面。这些模型的结构是:
resources :workouts do
resources :exercises do
resources :reports, shallow: true
end
end
我在参数的第一行调用param is missing or the value is empty: exercise
。我的全部(更新)exercises_controller
是:
class ExercisesController < ApplicationController
before_action :authenticate_user!
def index
@workout = Workout.friendly.find(params[:id])
@exercise = Exercise.new
@exercises = Exercise.all
end
def new
@workout = Workout.friendly.find(params[:id])
@exercise = Exercise.new
end
def create
@workout = Workout.friendly.find(params[:workout_id])
exercise = @workout.exercises.build(exercise_params)
exercise.user = current_user
if exercise.save
flash[:notice] = "Results saved successfully."
redirect_to [@workout]
else
flash[:alert] = "Results failed to save."
redirect_to [@workout]
end
end
def edit
@workout = Workout.friendly.find(params[:id])
exercise = Exercise.find(params[:id])
exercise.user = current_user
end
def destroy
@workout = Workout.friendly.find(params[:workout_id])
exercise = @workout.exercises.find(params[:id])
if exercise.destroy
flash[:notice] = "Exercise was deleted successfully."
redirect_to [@workout]
else
flash[:alert] = "Exercise couldn't be deleted. Try again."
redirect_to [@workout]
end
end
private
def exercise_params
params.require(:exercise).permit(:name, :needs_seconds, :needs_weight, :needs_reps, :workout_id)
end
def authorize_user
exercise = Exercise.find(params[:id])
unless current_user == current_user.admin?
flash[:alert] = "You do not have permission to create or delete an exercise."
redirect_to [exercise.workout]
end
end
end
我的结构中唯一复杂的是用户将能够从exercises
页面创建,编辑和删除exercises#index
全部内容。我用来访问此exercises#index
页面的链接来自workouts#show
页面:
<%= link_to 'Add/Edit Exercises', workout_exercises_path(@workout, @exercise), method: :index %>
最后,如果这里需要适用的路线:
workout_exercise_reports GET /workouts/:workout_id/exercises/:exercise_id/reports(.:format) reports#index
POST /workouts/:workout_id/exercises/:exercise_id/reports(.:format) reports#create
new_workout_exercise_report GET /workouts/:workout_id/exercises/:exercise_id/reports/new(.:format) reports#new
edit_report GET /reports/:id/edit(.:format) reports#edit
report GET /reports/:id(.:format) reports#show
PATCH /reports/:id(.:format) reports#update
PUT /reports/:id(.:format) reports#update
DELETE /reports/:id(.:format) reports#destroy
workout_exercises GET /workouts/:workout_id/exercises(.:format) exercises#index
POST /workouts/:workout_id/exercises(.:format) exercises#create
new_workout_exercise GET /workouts/:workout_id/exercises/new(.:format) exercises#new
edit_workout_exercise GET /workouts/:workout_id/exercises/:id/edit(.:format) exercises#edit
workout_exercise GET /workouts/:workout_id/exercises/:id(.:format) exercises#show
PATCH /workouts/:workout_id/exercises/:id(.:format) exercises#update
PUT /workouts/:workout_id/exercises/:id(.:format) exercises#update
DELETE /workouts/:workout_id/exercises/:id(.:format) exercises#destroy
workouts GET /workouts(.:format) workouts#index
POST /workouts(.:format) workouts#create
new_workout GET /workouts/new(.:format) workouts#new
edit_workout GET /workouts/:id/edit(.:format) workouts#edit
workout GET /workouts/:id(.:format) workouts#show
PATCH /workouts/:id(.:format) workouts#update
PUT /workouts/:id(.:format) workouts#update
DELETE /workouts/:id(.:format) workouts#destroy
任何人都可以看到产生此错误的参数有什么问题
其他信息:
这是我的exercises/index.html.erb
:
<div class="container col-sm-10 col-sm-push-1" style="margin-top: 100px">
<div class="opaque-card md-well well">
<h1>Current Exercises:</h1>
<% @exercises.each do |exercise| %>
<p><%= exercise.name %> (<%= link_to "Delete #{exercise.name}", exercise_path(exercise), method: :delete, data: { confirm: 'Are you sure?' } %>)</p>
<% end %>
<h1>Add New Exercises:</h1>
<%= render 'exercises/form' %>
</div> <!-- opaque card -->
</div> <!-- container -->
以下是exercises/form
呈现的内容:
<div class="row">
<div class="col-xs-10 col-xs-push-1">
<%= form_for @exercise do |f| %>
<%= f.hidden_field :workout_id, value: @workout.id %>
<div class="form-group">
<%= f.label :name, class: 'sr-only' %>
<%= f.text_field :name, class: 'form-control', placeholder: "Enter exercise name" %>
</div>
<div class="form-group col-xs-4">
<p><%= f.label :needs_seconds, class: 'sr-only' %>
<%= f.check_box :needs_seconds, class: 'check_box' %> Report seconds?</p>
</div>
<div class="form-group col-xs-4">
<p><%= f.label :needs_reps, class: 'sr-only' %>
<%= f.check_box :needs_reps, class: 'check_box' %> Report reps?</p>
</div>
<div class="form-group col-xs-4">
<p><%= f.label :needs_weight, class: 'sr-only' %>
<%= f.check_box :needs_weight, class: 'check_box' %> Report weight?</p>
</div>
<div class="text-center"><%= f.submit "Create Exercise", class: 'btn btn-primary' %></div>
<% end %>
</div>
</div>
在我遇到错误之前,这是服务器日志:
Started POST "/workouts/d/exercises" for ::1 at 2016-06-03 08:18:26 -0700
Processing by ExercisesController#create as HTML
Parameters: {"authenticity_token"=>"lygWA3+umw/oGYb/m/W3Oi+M8j/E6+bovZL8zNjO6oZglGkQQkR+FlPNh4CzmQjf4ZE9XffdDLoe4FJ3rPpZ0Q==", "workout_id"=>"d"}
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
Workout Load (0.1ms) SELECT "workouts".* FROM "workouts" WHERE "workouts"."slug" = ? ORDER BY "workouts"."id" ASC LIMIT 1 [["slug", "d"]]
Completed 400 Bad Request in 3ms (ActiveRecord: 0.2ms)
答案 0 :(得分:0)
我有一个chat with Liz,问题似乎来自show_workout
路由,其中method: :index
被添加为link_to的参数,从而导致POST(而不是{一个GET)请求到workout_exercise_path。路由器将此指向create操作,导致上述错误。
解决这个问题需要删除方法:: index。
其他一些小错误和修复是使用exercise_controller中的Workout.friendly.find(params[:id])
,但是,此上下文中的params [:id]将是exercise_id而不是workout_id。
然后form_for对象应该是[@workout,@ performance]
最后在exercise_exercises_path的练习列表中,因为没有路径作为exercise_path(因为嵌套资源),所以观察到错误。解决方法是将其更改为workout_exercise_path(@workout,exercise)