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