Rails上的参数错误:`param缺失或值为空:exercise`

时间:2016-06-03 14:26:26

标签: ruby-on-rails parameters

我正在尝试访问我的应用的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)

1 个答案:

答案 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)