簡體   English   中英

Rails 5 HABTM 不允許的參數

[英]Rails 5 HABTM Unpermitted parameters

在一天無處可去之后,我認輸了(答案可能非常簡單,但這就是代碼)。

好的,我有 2 個模型,用戶(帶有設計)和章節。

楷模:

class User < ApplicationRecord
  has_many :projects
  has_and_belongs_to_many :chapters
end

class Chapter < ApplicationRecord
  belongs_to :country
  has_and_belongs_to_many :users
  accepts_nested_attributes_for :users
end

_form.html.erb

[...]
<% @chapter.users.each_with_index do |chap_user, i| %>
  <div class="row">
    <div class="col-md-4 col-md-offset-4  col-xs-8 col-xs-offset-2">
      <small>User <%= i + 1 %></small>
    </div>
  </div>

  <div class="row">
    <div class="col-md-2 col-md-offset-4  col-xs-8 col-xs-offset-2">

      <div class="field form-group">
        <%= form.label 'First Name' %>
        <%= form.text_field :first_name, value: chap_user.first_name,class:"form-control"%>
      </div>
    </div>
    <div class="col-md-2 col-md-offset-0 col-xs-8 col-xs-offset-2">
      <div class="field form-group">
        <%= form.label 'Last Name' %>
        <%= form.text_field :last_name, value: chap_user.last_name, class:"form-control"%>
      </div>

    </div>
  </div>
  <div class="row">
    <div class="col-md-4 col-md-offset-4 col-xs-8 col-xs-offset-2">
      <div class="field form-group">
        <%= form.label :email %>
        <%= form.text_field :email, value: chap_user.email, class:"form-control"%>
      </div>

    </div>
  </div>
<% end %>
[...]

ChaptersController(參數)

private # 使用回調來共享操作之間的通用設置或約束。 def set_chapter @chapter = Chapter.find(params[:id]) end

# Never trust parameters from the scary internet, only allow the white list through.
def chapter_params
  params.fetch(:chapter, {})
  params.require(:chapter).permit(:city, :country_id, user_attributes: [:first_name,:last_name,:email])
end
# or...
params.require(:chapter).permit(:city, :country_id, user_ids: [])
# or...
params.require(:chapter).permit(:city, :country_id, user_attributes: [:id, :first_name])
# or...
params.require(:chapter).permit(:city, :country_id, users_attributes: [:id, :first_name])

控制器中的 binding.pry

  # PATCH/PUT /chapters/1
  # PATCH/PUT /chapters/1.json
  def update
    binding.pry
    respond_to do |format|
      if @chapter.update(chapter_params)
        format.html { redirect_to @chapter, notice: 'Chapter was successfully updated.' }
        format.json { render :show, status: :ok, location: @chapter }
      else
        format.html { render :edit }
        format.json { render json: @chapter.errors, status: :unprocessable_entity }
      end
    end
  end

binding.pry 響應

我知道這個有點難看,但基本上是提交了參數,但不允許 users[:first_name,:last_name,:email]

[1] pry(#)>chapter_params 不允許的參數: :first_name, :last_name, :email => "London", "country_id"=>"1"} 允許: true> [2] pry(#)> params => "✓", "_method"=>"patch", "authenticity_token"=>"9IdAqcAsVG5vvakSf7jHRk+WplN/GyVZUxmAdefUbTX/uI6IajmZPr1YSol21Zhzdl7P/lrl+SVnWr5m",="="="=", SVnWr5m","="="jhzdlwr5m","="jhpL" ", "first_name"=>"Tim2", "last_name"=>"Heard", "email"=>"jmcgregorx@spartaglobal.com"} 允許: false>, "commit"=>"Update", "controller" =>“章節”、“動作”=>“更新”、“id”=>“1”} 允許:false>

簡而言之,我想通過表單將某些用戶連接到某些章節,但我不知道如何通過章節更新/創建方法獲取嵌套參數。 我的頭是一團紅色,一團糟。 請幫忙。

由於您嘗試修改的字段用於子模型,因此您必須告訴表單,因為它假定您在默認情況下正在編輯父模型上的字段。 方法是使用#fields_for (特別是“一對多”部分)。

所以你會按照這些方式做一些事情(代碼下面的解釋):

<% @chapter.users.each_with_index do |chap_user, i| %>
  <%= form.fields_for :users, chap_user do |user_fields| %>
    <div class="row">
      <div class="col-md-4 col-md-offset-4  col-xs-8 col-xs-offset-2">
        <small>User <%= i+ 1 %></small>
      </div>
    </div>

    <div class="row">
      <div class="col-md-2 col-md-offset-4  col-xs-8 col-xs-offset-2">
        <div class="field form-group">
          <%= user_fields.label 'First Name' %>
          <%= user_fields.text_field :first_name, value: chap_user.first_name,class:"form-control"%>
        </div>
      </div>
      <div class="col-md-2 col-md-offset-0 col-xs-8 col-xs-offset-2">
        <div class="field form-group">
          <%= user_fields.label 'Last Name' %>
          <%= user_fields.text_field :last_name, value: chap_user.last_name, class:"form-control"%>
        </div>
      </div>
    </div>

    <div class="row">
      <div class="col-md-4 col-md-offset-4 col-xs-8 col-xs-offset-2">
        <div class="field form-group">
          <%= user_fields.label :email %>
          <%= user_fields.text_field :email, value: chap_user.email, class:"form-control"%>
        </div>
      </div>
    </div>
  <% end %>
<% end %>

改變的是我使用#fields_for方法將所有表單輸入包裝在一個塊中,以指定現在我們正在修改子屬性。 當我們這樣做時,我們還指定了一個變量名稱,該名稱將用於為子模型的屬性生成字段。 我將它命名為user_fields ,然后在該塊中用user_fields替換了所有form user_fields

在您的 ChaptersController 中,您希望接受參數的行是:

params.require(:chapter).permit(:city, :country_id, users_attributes: [:id, :first_name, :last_name, :email])

您需要users_attributes而不是user_attribute因為復數“users”告訴 rails 期望多個孩子(多個用戶)的屬性。 然后在該數組中,您想告訴它所有期望的字段,包括id 即使您沒有為 ID 顯式定義一個字段,Rails 也會放置一個字段來允許您編輯已經存在的子項的屬性(並且不僅能夠創建新的子項)。 來自文檔的片段:

請注意,#fields_for 會自動生成一個隱藏字段來存儲記錄的 ID。 在某些情況下不需要此隱藏字段,您可以傳遞 include_id: false 以防止 #fields_for 自動呈現它。

如果關於此的某些內容不起作用,或者您有更多問題,請隨時告訴我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM