2017-01-14 11 views
1

これで、Rails 5の1つのフォームから複数のオブジェクトを作成しようとしています。何が原因でエラーが発生しているのか(私はそれがビューと関係していると思います)。Rails - NoMethodError(定義されていないメソッド "permit" for "reps":string)

レール5にアップグレードした後にもう一度実行した問題は、私のフォームは最後のレコードのみを提出することになります。私は参照用にこのウォークスルーを使用しました:http://vicfriedman.github.io/blog/2015/07/18/create-multiple-objects-from-single-form-in-rails/

This is the inputと ここに私が送信しているパラメータです。

Parameters: {"utf8"=>"√", "authenticity_token"=>"3j8A0oNW3sM5VIi11ZEHwpwlAhvY3 
vml1kcLHfWdptySKSeJokRmBXObh/HEFBwG4/QC8PdfX7NKbkrGjOfI6Q==", "exercise_id"=>"16 
5", "exercise_sets"=>{"reps"=>"1", "weight"=>"1"}, "exerciseName"=>"imsick", "co 
mmit"=>"Save changes"} 

エラー

NoMethodError (undefined method 'permit' for "reps":string) 

ExerciseSetsController:

def create 
    if current_trainer 
     savedMirror = current_trainer.exercises.find_by_name(params[:exerciseName]) 

     params['exercise_sets'].each do |set| 
      #set[:timeFormat] = savedMirror.exercise_sets[0].timeFormat 
      #set[:weightFormat] = savedMirror.exercise_sets[0].weightFormat 
      #set[:distanceFormat] = savedMirror.exercise_sets[0].distanceFormat 
      ExerciseSet.create(exercise_set_params(set)) 
     end 

     flash[:notice] = "Sets added" 
     redirect_to (:back) 
    end 
end 

private 
def exercise_set_params(e_params) 
    e_params.permit(:id, :reps, :weight, :weightFormat, :time, :timeFormat, :distance, :distanceFormat, :exercise_id, :_destroy) 
end 

ビュー:

<%savedMirror = current_trainer.exercises.find_by_name(e.name)%> 
<%= form_tag url_for(controller: "exercise_sets", action: "create") do%> 
    <ul class="list-group"> 
     <% e.sets.times do |i|%> 
     <%= fields_for "exercise_sets[]", @exerciseSet do |f| %> 
     <li class="list-group-item"> 
      <label>Set: <%=i+1%></label> 
       <%#= f.number_field :user_id, value: e.user_id, style:"visibility:hidden; margin:-15px;"%> 
       <%= hidden_field_tag(:exercise_id, e.id) %> 

       <div class = "row"> 
       <% if savedMirror.exercise_sets[0].reps == 1%> 
        <div class="col-sm-3"> 
        <%= f.label :reps, "Reps" %><br> 
        <%= f.text_field :reps, class: "form-control"%> 
        </div> 
       <%end%> 
       <% if savedMirror.exercise_sets[0].weight == 1%> 
        <div class="col-sm-3"> 
        <%= f.label :weight, "Weight" %><br> 
         <%= f.text_field :weight, class: "form-control"%> 
        </div> 
       <%end%> 
       <% if savedMirror.exercise_sets[0].time == 1%> 
        <div class="col-sm-3"> 
        <%= f.label :time, "Time" %><br> 
         <%= f.text_field :time, class: "form-control"%> 
        </div> 
       <%end%> 
       <% if savedMirror.exercise_sets[0].distance == 1%> 
        <div class="col-sm-3"> 
        <%= f.label :distance, "Distance" %><br> 
        <%= f.text_field :distance, class: "form-control"%> 
        </div> 
       <%end%> 
       </div> 
     </li> 
     <%end%> 
     <%end%> 
     <br> 
     <%= hidden_field_tag(:exerciseName, e.name) %> 
     <%=submit_tag%> 
    </ul> 
    <% end %> 
<%end%> 

すべてのヘルプは大歓迎です、ありがとうございました!

+0

代わりにRailsコードの変更を答えて、それを1日後に回答としてマークできますか? –

+0

良い点が掲載されました! –

答えて

0

は、問題を修正しました:

私は配列として渡す代わりにして、ハッシュのように値を渡していませんでした。個々のフィールドを次のように変更して修正しました:

<input type="text" name="exercise_sets[][reps]" class="form-control" /> 

<input type="text" name="exercise_sets[][weight]" class="form-control" /> 

...など。

0

強力なパラメータを使用するには、.require(:exercise)(私はあなたのモデルの名前がエクササイズであると仮定しています)を追加する必要があります。

必須とすると、モデルを渡さないとアプリでエラーが発生する可能性があります。ホワイトリストに載っているパラメータは、そのモデルに対して定義されているためです。ただ、

def exercise_set_params(e_params) 
    e_params.require(:exercise).permit(:id, :reps, :weight, :weightFormat, :time, :timeFormat, :distance, :distanceFormat, :exercise_id, :_destroy) 
end 

def exercise_set_params(e_params) 
    e_params.permit(:id, :reps, :weight, :weightFormat, :time, :timeFormat, :distance, :distanceFormat, :exercise_id, :_destroy) 
end 

を交換

は、それが作品を願って!

+0

助けてくれてありがとう!残念ながら私は今このエラーを受け取ります: NoMethodError(プライベートメソッド '要求'は "reps"のために呼ばれました:文字列) 私はそれが私が提出しているパラメータのフォーマットと関係があると思います。 –

0

に見えます:reps:weightは、だから私はこれを試してみたくなるでしょう。この

"exercise_sets"=>{"reps"=>"1", "weight"=>"1"} 

のようなネストされたのparamsとして渡されますよう:

e_params.permit(:id, exercise_sets: [:reps, :weight], :weightFormat, :time, :timeFormat, :distance, :distanceFormat, :exercise_id, :_destroy) 

注ネスト:

exercise_sets: [:reps, :weight] 

maybそれを行うe。

+0

あなたはコードを読まなかった。 'params ['exercise_sets']。それぞれdo | set | ... exercise_set_params(set) '' e_params'はすでに問題のネストされたキーだけを含むべきパラメータオブジェクトです。 –

+0

ええ、私の悪い、とにかく彼の問題を解決した友達のように見えます:) – stephenmurdoch

関連する問題