Я построил довольно сложную форму, которая создает один рецепт с множеством реализаций. Я использую этот синтаксис:
- provide(:title, 'Create prescription')
%h1 Add medicines to prescription
.row
.span6.offset3
= form_for @prescription do |f|
= render 'shared/error_prescription_messages'
%p
= f.hidden_field :patient_id, :value => params[:patient_id]
= f.hidden_field :user_id, :value => current_user.id
= f.fields_for :relations do |builder|
= render 'child_form', :f => builder
%p= f.submit "Submit"
chlid_form довольно прост:
- it=f.options[:child_index].to_i
- n= it.to_s
%h2
= "Medicine ##{it+1}"
= f.hidden_field :medicine_id, :id => "my_medicine_id#{it}"
- if params[:prescription].nil? || params[:prescription][:relations_attributes][n.to_sym][:medicine_name].nil?
= f.autocomplete_field :medicine_name, autocomplete_medicine_name_relations_path, :id_element => "#my_medicine_id#{it}"
- else
= f.autocomplete_field :medicine_name, autocomplete_medicine_name_relations_path, :id_element => "#my_medicine_id#{it}", :value => params[:prescription][:relations_attributes][n.to_sym][:medicine_name]
= f.label :amount, "Amount of medicine boxes"
= f.number_field :amount, :value => 1
= f.label :daily
= f.number_field :daily, :value => 1
= f.label :period_in_days, "Duration of treatment (in days)"
= f.number_field :period_in_days, :value => 1
Итак, как вы можете видеть, я использую f.options[:child_index]
для получения индекса дочернего элемента (0,1,2 ...), потому что я генерирую несколько элементов с этой конкретной формой. Затем я помещаю его в переменную it
и успешно использую в :id_element => "#my_medicine_id#{it}"
, который отлично работает (создает my_medicine_id0, my_medicine_id1 ....) Хотя в этой строке он не работает:
:value => params[:prescription][:relations_attributes][n.to_sym][:medicine_name]
где n
просто n=it.to_s
.
Я хотя что-то не так в контроллере, но если я изменю эту строку на любое :value => params[:prescription][:relations_attributes]**[:'0']**[:medicine_name]
или любое другое целое число от 0 до 4, все будет отлично работать, но мне НУЖНО динамическое изменение в этом. Итак, я получил доказательство того, что он ДЕЙСТВИТЕЛЬНО работает, потому что здесь он генерирует целочисленное значение "#my_medicine_id#{it}"
, но не будет работать в хэше! И когда я печатаю весь хеш из параметров, я получаю следующее:
{"patient_id"=>"7", "user_id"=>"1", "relations_attributes"=>{"0"=>{"medicine_id"=>"13490", "medicine_name"=>"Locacid 500 mcg/g (0,05%) (1 tuba 30 g)", "amount"=>"0", "daily"=>"1", "period_in_days"=>"1"}, "1"=>{"medicine_id"=>"", "medicine_name"=>"", "amount"=>"1", "daily"=>"1", "period_in_days"=>"1"}, "2"=>{"medicine_id"=>"", "medicine_name"=>"", "amount"=>"1", "daily"=>"1", "period_in_days"=>"1"}, "3"=>{"medicine_id"=>"", "medicine_name"=>"", "amount"=>"1", "daily"=>"1", "period_in_days"=>"1"}, "4"=>{"medicine_id"=>"", "medicine_name"=>"", "amount"=>"1", "daily"=>"1", "period_in_days"=>"1"}}}
поэтому для получения нужных мне значений совершенно очевидно, что params[:prescription][:relations_attributes][SOME_KIND_OF_INETEGER][:medicine_name]
должен работать, но не работает.
Код контроллера:
class PrescriptionsController < ApplicationController
before_action :signed_in_user
before_action :doctor_user, only: [:new, :create]
before_action :pharmacist_user, only: [:update]
def new
@prescription =Prescription.new
5.times { @prescription.relations.build }
end
def create
@prescription = Prescription.new(new_prescription_params)
if @prescription.save
flash[:success] = "Prescription created."
redirect_to @prescription
else
5.times { @prescription.relations.build }
render 'new', :prescription => params[:prescription]
end
end
def show
@prescription = Prescription.find(params[:id])
@medicines = @prescription.medicines.paginate(page: params[:page], :per_page => 10)
end
def update
@prescription = Prescription.find(params[:id])
@patient = Patient.find(params[:patient_id])
if !prescription_expired?(@prescription)
@prescription.realized = 1
if @prescription.save
flash[:success] = "Prescription realized."
redirect_to @patient
else
redirect_to root_url
end
else
flash[:notice] = "Can't realize, prescription expired."
redirect_to @patient
end
end
private
def new_prescription_params
params.require(:prescription).
permit(:patient_id, :user_id, relations_attributes: [:medicine_id, :medicine_name, :amount, :daily, :period_in_days])
end
def doctor_user
redirect_to(root_url) unless current_user.function == "doctor"
end
def pharmacist_user
redirect_to(root_url) unless current_user.function == "pharmacist"
end
def prescription_expired?(presc)
presc.created_at < 1.month.ago
end
def signed_in_user
unless signed_in?
store_location
flash[:notice] = "Please log in."
redirect_to login_url
end
end
конец
У меня кончились идеи, поэтому я прошу вас, ребята, может ли кто-нибудь помочь. Спасибо.
[n.to_sym]
... Я думаю,[n]
сработает, не так ли? Это не символ в хеш-дампе. - person SteveTurczyn   schedule 24.05.2014