Saya memiliki Bill
objek, yang memiliki banyak Due
objek. The Due
objek juga milik Person
. Saya ingin formulir yang dapat membuat Bill
dan anak-anaknya Dues
semuanya dalam satu halaman. Saya mencoba membuat formulir menggunakan atribut bersarang, mirip dengan yang ada di Railscast ini .
Kode yang relevan tercantum di bawah ini:
karena.rb
class Due < ActiveRecord::Base
belongs_to :person
belongs_to :bill
end
bill.rb
class Bill < ActiveRecord::Base
has_many :dues, :dependent => :destroy
accepts_nested_attributes_for :dues, :allow_destroy => true
end
bills_controller.rb
# GET /bills/new
def new
@bill = Bill.new
3.times { @bill.dues.build }
end
tagihan / _form.html.erb
<%= form_for(@bill) do |f| %>
<div class="field">
<%= f.label :company %><br />
<%= f.text_field :company %>
</div>
<div class="field">
<%= f.label :month %><br />
<%= f.text_field :month %>
</div>
<div class="field">
<%= f.label :year %><br />
<%= f.number_field :year %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<%= f.fields_for :dues do |builder| %>
<%= render 'due_fields', :f => builder %>
<% end %>
<% end %>
tagihan / _due_fields.html.erb
<div>
<%= f.label :amount, "Amount" %>
<%= f.text_field :amount %>
<br>
<%= f.label :person_id, "Renter" %>
<%= f.text_field :person_id %>
</div>
UPDATE ke bills_controller.rb Ini berfungsi!
def bill_params
params
.require(:bill)
.permit(:company, :month, :year, dues_attributes: [:amount, :person_id])
end
Bidang yang tepat diberikan pada halaman (meskipun Person
belum ada dropdown ) dan pengiriman berhasil. Namun, tidak ada iuran anak-anak yang disimpan ke database, dan kesalahan dilemparkan ke log server:
Unpermitted parameters: dues_attributes
Tepat sebelum kesalahan, log menampilkan ini:
Started POST "/bills" for 127.0.0.1 at 2013-04-10 00:16:37 -0700
Processing by BillsController#create as HTML<br>
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"ipxBOLOjx68fwvfmsMG3FecV/q/hPqUHsluBCPN2BeU=",
"bill"=>{"company"=>"Comcast", "month"=>"April ",
"year"=>"2013", "dues_attributes"=>{
"0"=>{"amount"=>"30", "person_id"=>"1"},
"1"=>{"amount"=>"30", "person_id"=>"2"},
"2"=>{"amount"=>"30", "person_id"=>"3"}}}, "commit"=>"Create Bill"}
Apakah ada perubahan di Rails 4?
ruby-on-rails
ruby-on-rails-4
jcanipar
sumber
sumber
Jawaban:
Tampaknya ada perubahan dalam penanganan perlindungan atribut dan sekarang Anda harus memasukkan daftar putih pada pengontrol (alih-alih attr_accessible dalam model) karena bekas permata opsional strong_parameters menjadi bagian dari Rails Core.
Seharusnya terlihat seperti ini:
Jadi
params.require(:model).permit(:fields)
akan digunakandan untuk atribut bertingkat seperti
Beberapa perincian lebih lanjut dapat ditemukan di dokumen API Ruby edge dan strong_parameters di github atau di sini
sumber
def bill_params params.require(:bill).permit(:company, :month, :year, :dues_attributes[:amount, :person_id]) end
Saya sekarang mendapatkan kesalahan ini: tidak ada konversi yang tersirat dari Symbol menjadi Integerpets_attributes: [:id, :name, :category]
Jika tidak, saat Anda mengedit, setiap hewan peliharaan akan dibuat lagi.Person.create(person_params)
atau tidak akan memanggil metode. Sebaliknya Anda akan mendapatkannyaActiveModel::ForbiddenAttributesError
.:_destroy
parameter yang disembunyikan . yaitupets_attributes: [:id, :name, :category, :_destroy]
Dari dokumen
Atribut bersarang adalah dalam bentuk hash. Di aplikasi saya, saya memiliki model Question.rb menerima atribut bersarang untuk model Answer.rb (di mana pengguna membuat pilihan jawaban untuk pertanyaan yang ia buat). Dalam question_controller, saya melakukan ini
Segala sesuatu dalam hash pertanyaan diizinkan, termasuk atribut jawaban bersarang. Ini juga berfungsi jika atribut bersarang dalam bentuk array.
Karena itu, saya bertanya-tanya apakah ada masalah keamanan dengan pendekatan ini karena pada dasarnya memungkinkan apa pun yang ada di dalam hash tanpa menentukan dengan tepat apa itu, yang tampaknya bertentangan dengan tujuan parameter yang kuat.
sumber
.permit!
satu-satunya pilihan? Saya tidak bisa membuatnya berfungsi bahkan dengan semua atribut model diizinkan karena tersedak array.atau Anda cukup menggunakan
sumber
Sebenarnya ada cara untuk hanya daftar putih semua parameter bersarang.
Metode ini memiliki keunggulan dibandingkan solusi lain. Hal ini memungkinkan untuk mengizinkan parameter mendalam.
Sementara solusi lain seperti:
Jangan.
Sumber:
https://github.com/rails/rails/issues/9454#issuecomment-14167664
sumber
Hari ini saya menemukan masalah yang sama, saat bekerja pada rails 4, saya bisa membuatnya bekerja dengan menyusun bidang saya untuk:
Kemudian di controller saya, saya memiliki params kuat saya sebagai:
Semua bekerja!
sumber
Jika Anda menggunakan bidang JSONB, Anda harus mengonversinya ke JSON dengan .to_json (ROR)
sumber