【问题标题】:Ruby On Rails: Parameters - Permitted: falseRuby On Rails:参数 - 允许:false
【发布时间】:2019-12-17 17:57:05
【问题描述】:

我的 Rails 6 应用程序中的表单出现问题。

我有一个远程表单,它通过 JSON 请求将新数据输入到数据库中,它可以工作,但只有一个参数。这是表格:

<%= form_with(method: :post, remote: true, model: Meal.new, url: meals_path, class: "editMealsForm", data: { type: "json" }) do |f| %>
    <div class="field">
        <%= f.label :description, 'Beschreibung' %><br>
        <%= f.text_area :description, rows: "4", placeholder: "Noch keine Mahlzeit für diesen Tag vorhanden, bitte eintragen!", class: "form-control" %>
    </div>
    <div class="field">
        <%= f.label :allergene_ids_add, 'Allergene auswählen', class: "card-text" %><br>
        <%= select_tag :allergene_ids_add, options_from_collection_for_select(@allergenes, :id, :name), multiple: true, class: "selectpicker", data: { style: "btn-success", width: "fit", live_search: "true", size: "5", title: "Allergien wählen" } %>
    </div>

    <% f.hidden_field :day, :value => local_assigns[:mealDay] %>
    <% f.hidden_field :tip, :value => "Vollkost" %>

    <%= f.submit "Speichern", class: "btn btn-primary mt-2 btn-block" %>
<% end %>

这些是我允许的参数:

def meal_params
  params.require(:meal).permit(:day, :tip, :description, allergene_ids_add: [])
end

这是我的控制器操作:

def create
    @meal = Meal.new(meal_params)
    byebug
    if @meal.save
      if params[:allergene_ids_add].present?
        @allergenes_to_add = Allergene.find(params[:allergene_ids_add])
        @allergenes_to_add.each do |allergene|
          @meal.allergenes << allergene
        end
      end
      respond_to do |format|
        format.html { redirect_to meals_path }
        format.json { render json: @meal }
      end
    end
  end

问题是,如果我点击创建操作,只允许描述参数,其他的只是“忽略”,所以如果我触发提交按钮,如果我点击我的控制台,我会在控制台中得到以下输出byebug 断点:

如果我查看参数:

<ActionController::Parameters {"authenticity_token"=>"derBZeirq0bwr/FWoYRr97qUZ5p66vQc+uT+UMf5xjXXTSFEp+XOepJtGrckguGh+skWXTZ9ibHWfFTt3p80Cg==", "meal"=><ActionController::Parameters {"description"=>"test"} permitted: false>, "commit"=>"Speichern", "controller"=>"meals", "action"=>"create"} permitted: false>

或者就餐参数:

<ActionController::Parameters {"description"=>"test"} permitted: true>

如果我运行 @meal.valid?,它会返回 true,所以我看不出问题出在哪里。

此外,如果我检查表单中隐藏字段的值,它们会被填充而不是 nil。

那么为什么这一个参数有效,但即使我在 meal_params 方法中获得了其余参数,也不允许使用其余参数?

【问题讨论】:

  • Allergene.find(params[:allergene_ids_add]): params[:allergene_ids_add] 是不允许的; meal_params[:allergene_ids_add] 是。
  • 是的,我也没有注意到它已修复,我只是从另一种方法复制了它:)。我猜这是 hidden_​​fields 的问题,因为其他参数也没有显示。
  • 您的if params[:allergene_ids_add].present? 行应该使用meal_params,而不仅仅是params,不是吗?

标签: ruby-on-rails json ruby forms


【解决方案1】:

好吧,我很笨。 我只是忘记了隐藏字段的=

所以而不是:

<% f.hidden_field :day, :value => local_assigns[:mealDay] %>
<% f.hidden_field :tip, :value => "Vollkost" %>

应该是:

<%= f.hidden_field :day, :value => local_assigns[:mealDay] %>
<%= f.hidden_field :tip, :value => "Vollkost" %>

然后一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2013-09-14
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多