[英]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
[...]
<% @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 %>
[...]
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])
# 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
我知道這個有點難看,但基本上是提交了參數,但不允許 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.