Html Rails-NoMethodError(未定义的方法&x27;允许&x27;用于";reps";:字符串)

Html Rails-NoMethodError(未定义的方法&x27;允许&x27;用于";reps";:字符串),html,ruby-on-rails,Html,Ruby On Rails,所以我尝试在Rails 5中从一个表单创建多个对象。这在Rails4.2中运行得非常好,我不确定是什么导致了错误(我想这与视图有关) 升级到rails 5后遇到的另一个问题是,现在我的表单只提交最后一条记录。我使用此演练作为参考: 及 这是我发送的参数 Parameters: {"utf8"=>"√", "authenticity_token"=>"3j8A0oNW3sM5VIi11ZEHwpwlAhvY3 vml1kcLHfWdptySKSeJokRmBXObh/HEFBwG4/Q

所以我尝试在Rails 5中从一个表单创建多个对象。这在Rails4.2中运行得非常好,我不确定是什么导致了错误(我想这与视图有关)

升级到rails 5后遇到的另一个问题是,现在我的表单只提交最后一条记录。我使用此演练作为参考:

及 这是我发送的参数

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)
练习控制器:

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%>

  • 设置:





非常感谢您的帮助,谢谢

您需要添加
。require(:exercise)
(我假设您的模型名为exercise)才能使用强参数

如果您未通过模型,则要求将使您的应用程序出现错误。因为白名单中的参数是为该模型定义的

替换

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

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

希望它能起作用

您需要添加
。require(:exercise)
(我假设您的模型名为exercise)才能使用强参数

如果您未通过模型,则要求将使您的应用程序出现错误。因为白名单中的参数是为该模型定义的

替换

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

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

希望它能起作用

它看起来像是
:rep
,和
:weight
,作为嵌套参数传递,如下所示

"exercise_sets"=>{"reps"=>"1", "weight"=>"1"}
所以我很想试试这个:

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

exercise_sets: [:reps, :weight]

也许这样就可以了。

它看起来像是
:rep
,和
:weight
,作为嵌套参数传递,如下所示

"exercise_sets"=>{"reps"=>"1", "weight"=>"1"}
所以我很想试试这个:

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

exercise_sets: [:reps, :weight]
也许这样就可以了。

修复了问题:

我不是以散列形式传递值,而是以数组形式传递。我通过将各个字段更改为:

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

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

。。。等等。

解决了这个问题:

我不是以散列形式传递值,而是以数组形式传递。我通过将各个字段更改为:

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

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


。。。以此类推。

在我的例子中,我在参数中使用axios为ajax发送数据时遇到了同样的问题,解决方案是在“数据”中添加值,而不是在“参数”中添加值


在我的例子中,我在参数中使用axios为ajax发送数据时遇到了同样的问题,解决方案是在“数据”中添加值,而不是在“参数”中添加值


谢谢你的帮助!不幸的是,我现在得到了这个错误:NoMethodError(私有方法'require'为“reps:string”调用)我相信这与我提交的参数的格式有关。谢谢你的帮助!不幸的是,我现在得到了这个错误:NoMethodError(私有方法'require'为“reps:string”调用)我相信这与我提交的参数的格式有关。您没有阅读代码<代码>参数['exercise|u set']。每个do | set |。。。练习设置参数(set)因此
e\u参数
已经是一个参数对象,应该只包含有问题的嵌套键。是的,我的错,看起来这个家伙解决了他的问题:)你没有读代码<代码>参数['exercise|u set']。每个do | set |。。。练习设置参数(set)因此
e\u参数
已经是一个参数对象,应该只包含所讨论的嵌套键。是的,我的错,看起来这个家伙解决了他的问题:)你能用你对Rails代码所做的更改来回答吗,并在一天后将其标记为答案?好的,发布了!你能用你对Rails代码所做的修改来做一个答案吗,并在一天后将其标记为答案?好的观点,发布!