There are tenders controller

class Admin::TendersController < Admin::BaseController before_action :set_tender_edit_form, only: [:show, :edit, :update, :destroy] before_action :set_tender_decide_form, only: [:decide] before_action :require_manager def index @tenders = Tender.all end def show @user_items = UserItem.all end def new @tender = Tender::AsCreateForm.new 1.times { @tender.items.build} end def edit end def create @tender = Tender::AsCreateForm.new(tender_params) if @tender.save flash[:success] = "Тендер создан. Будут уведомлены #{@tender.recipients_count} пользователей." TendersMailer.tender_created(@tender).deliver redirect_to admin_tenders_path else render 'new' end end def update if @tender.update(tender_params) flash[:success] = 'Тендер отредактирован.' redirect_to admin_tender_path(@tender) else render 'edit' end end def destroy @tender.destroy flash[:success] = 'Тендер удален.' TendersMailer.tender_destroyed(@tender).deliver redirect_to admin_tenders_url end def decide if @tender.update(choose_winner_params) flash[:success] = "Тендер завершен. #{@tender.sended_mails} уведомлений отправлено поставщикам" redirect_to :back else render 'show' end end def close_without_winner @tender = Tender.find(params[:id]).becomes(Tender::AsCloseWithoutWinner) if @tender.save flash[:success] = "Тендер завершен. #{@tender.sended_mails} уведомлений отправлено поставщикам" redirect_to :back else render 'show' end end def start_second_stage @tender = Tender.find(params[:id]).becomes(Tender::AsStartSecondStage) if @tender.save flash[:success] = "Начат второй этап. #{@tender.sended_mails} уведомлений отправлено поставщикам" redirect_to :back else render 'show' end end private def set_tender_edit_form @tender = Tender.find(params[:id]).becomes(Tender::AsEditForm) end def set_tender_decide_form @tender = Tender.find(params[:id]).becomes(Tender::AsChooseWinnerForm) end def tender_params params.require(:tender).permit( :name, :status_id, :uslovie, :dopuslovie, :data_start, :data_end, :fls, :manager_id, :etap, items_attributes: [:id, :name, :quantity, :measure_unit, :gost, :description, :_destroy, :winner_id], category_ids: [] ) end def choose_winner_params params.require(:tender).permit( items_attributes: [:id, :winner_id], ) end end 

There is a view

 <%= nested_form_for @tender, url: @tender.new_record? ? admin_tenders_path : admin_tender_path(@tender), as: :tender do |f| %> <div class="row"> <div class="col-lg-12"> <%= render 'shared/error_messages', target: @tender %> </div> </div> <div class="row"> <div class="col-lg-12"> <div class="panel panel-default"> <div class="panel-heading"> <%= title %> </div> <div class="panel-body"> <div class="row"> <div class="col-lg-6"> <div class="form-group"> <%= f.label :name, 'Заголовок' %> <%= f.text_field :name, class: 'form-control' %> </div> <% if f.object.new_record? %> <div class="form-group"> <%= f.label :data_start, 'Дата начала' %> <div class='input-group date' id='datetimepicker1'> <%= f.text_field :data_start, class: 'form-control' %> <span class="input-group-addon"> <span class="glyphicon glyphicon-calendar"></span> </span> </div> </div> <div class="form-group"> <%= f.label :data_end, 'Дата окончания' %> <div class='input-group date' id='datetimepicker2'> <%= f.text_field :data_end, class: 'form-control' %> <span class="input-group-addon"> <span class="glyphicon glyphicon-calendar"></span> </span> </div> </div> <% end %> <div class="form-group"> <%= f.label :manager_id, 'Менеджер' %> <% if current_manager.admin? %> <%= f.collection_select(:manager_id, Manager.all, :id, :name, {:prompt=>true}, {:class=>'form-control'}) %> <% else %> <%= current_manager.name %> <%= f.hidden_field :manager_id, :value => @current_manager.id %> <% end %> </div> <div class="form-group"> <%= f.label :uslovie, 'Условия тендера' %> <%= f.text_area :uslovie, rows: '4', class: 'form-control' %> </div> <div class="form-group"> <%= f.label :dopuslovie, 'Дополнительно' %> <%= f.text_area :dopuslovie, rows: '4', class: 'form-control' %> </div> <div class="form-group"> <%= f.label :fls, 'Прикрепить файл' %> <%= f.file_field :fls %> </div> </div> <div class="col-lg-6"> <h1>Категории тендеров</h1> <div class="form-group"> <p class="help-block">От категории зависит группа рассылки приглашений для поставщиков</p> <%= f.label :categories, 'Категории' %> <%= f.collection_check_boxes(:category_ids, Category.all, :id, :name, prompt: true) do |b| %> <% b.label(class: 'checkbox') { b.check_box + ' ' + b.text } %> <% end %> </div> </div> </div> <div class="row"> <div class="col-lg-12"> <h2 class="sub-header">Добавить позиции</h2> <div class="table-responsive"> <%= f.fields_for :items do |items_form| %> <%= render 'item_fields', :f => items_form %> <% end %> </div> <%= f.link_to_add 'Добавить', :items, class: 'btn btn-xs btn-success' %> </div> </div> </div> <div class="panel-heading"> <%= f.submit (f.object.new_record? ? 'Создать' : 'Обновить'), class: 'btn btn-primary' %> </div> </div> </div> </div> <% end %> 

I want to do the following. I want to do something like in a new view.

 <%= form_tag(new_admin_tender_path, method: "GET") do %> <form role="form"> <div class="form-group"> <%= text_area_tag(:data) %> </div> <%= submit_tag("Импорт") %> </form> <% end %> 

And in the controller to do something like the following

 rows = data.split("\n") rows.each do |row| vals = row.split("\t") item = Item.new( name: vals[0], quantity: vals[1], measure_unit: vals[2], gost: vals[3], description: vals[4] ) @tenders.items << item end 

That is, I want to enter data into text_area_tag , press the import button, and I would refresh the page and all of this data with text_area_tag would text_area_tag up and fall into the fields I needed, but I can’t get enough of this question.

Update

I thought what I need to do in the controller so

 def new rows = data.split("\n") rows.each do |row| vals = row.split("\t") item = Item.new( name: vals[0], quantity: vals[1], measure_unit: vals[2], gost: vals[3], description: vals[4] ) @tenders.items << item end @tender = Tender::AsCreateForm.new 1.times { @tender.items.build} end 

Thats getting

undefined local variable or metjod 'data' for controller

Update 2

 def new data = params[:data] unless data.nil? rows = data.split("\n") rows.each do |row| vals = row.split("\t") item = Item.new( name: vals[0], quantity: vals[1], measure_unit: vals[2], gost: vals[3], description: vals[4] ) @tenders.items << item end end @tender = Tender::AsCreateForm.new 1.times { @tender.items.build} end 

It has passed, but now it has

undefined method items for nil

In line

 @tenders.items << item 
  • one
    What exactly does not work? Error somewhere? - MAXOPKA
  • I don’t know how I’m going to type in text_area_tag in data from this row rows = data.split ("\ n") - Kenny
  • one
    No shit did not understand - SlyDeath
  • In order to make your questions easier to answer, you should read the manual. How to create a brief, complete and reliable example - Timofei Bondarev

2 answers 2

I understand the question is: "Where can I find the sent data from the form in the controller action?"

All data that is transmitted via forms to the controller action can be obtained from the params hash.

If you do not know the structure of the transmitted data, then run in the action:

 abort params.to_s 

or

 abort params.to_yaml 

The execution of the action will be interrupted by issuing a message containing the transmitted data. In general, the contents of the data field in the controller action can be obtained as follows:

 data = params[:data] 

PS Access to the value of text_field - here something like that was asked.

    Thank you earned

     def new data = params[:data] @tender = Tender::AsCreateForm.new 1.times { @tender.items.build} unless data.nil? rows = data.split("\n") rows.each do |row| vals = row.split("\t") item = Item.new( name: vals[0], quantity: vals[1], measure_unit: vals[2], gost: vals[3], description: vals[4] ) @tender.items << item end end end