form_for, fields_for и две модели - PullRequest
0 голосов
/ 08 марта 2011

У меня есть форма, которая создает два объекта и сохраняет их в базе данных.

Я хочу сделать следующие вещи :

  • сохранение данных в базе данных (объекты стенда)
  • проверить поля (у меня есть проверка в модели)
  • и если проверка не пройдена, я хочу заполнить поля введенными данными
  • изменить действие для этой формы

Проблемы

  • Если я использую @report, я получаю:

Вызывается идентификатор для ноль, который будет ошибочно быть 4 ошибка

(не могу найти объект). Я имею в контроллере, в действии сотворения @report = ReportMain.new и в действии, которые визуализируют это представление.

  • Когда я использую: report_main (название модели), он работает, он сохраняет данные в базу данных, но я не могу заполнить поля, когда проверка не пройдена.

Вопросы:

  • Что делать с этими двумя моделями, чтобы заставить это работать (проверка, заполнение полей, редактирование)?
  • Можете ли вы дать мне несколько советов, если подход неправильный?

Мой взгляд выглядит так:

<%= form_for(@report, :url => {:action => 'encreate'}) do |f| %>

<%= render "shared/error_messages", :target => @report %>

<%= f.text_field(:amount) %>


<% fields_for @reporte do |r| %>
    <%= r.check_box(:q_pripadnost) %>Pripadnost Q listi


    <%= select_tag('nacinpakovanja',options_for_select([['Drveno bure', 'Drveno bure'], ['Kanister', 'Kanister'], ['Sanduk', 'Sanduk'], ['Kese', 'Kese'], ['Posude pod pritiskom', 'Posude pod pritiskom'], ['Kompozitno pakovanje', 'Kompozitno pakovanje'], ['Rasuto', 'Rasuto'], ['Ostalo', 'Ostalo']])) %> 

    <%= r.text_field(:ispitivanjebroj) %>
    <%= r.text_field(:datumispitivanja) %>


<% end %>


<input id="datenow" name="datenow" size="30" type="text" value="<%= @date %>">

<div class="form-buttons">
       <%= submit_tag("Unesi izvestaj") %>
</div>

<% end%>

создавать актин в ReportController:

def encreate

    @report = ReportMain.new
    @reporte = ReportE.new
    @reportparam = params[:report_main]


    @report.waste_id = params[:waste][:code]
    @report.warehouse_id = Warehouse.find_by_user_id(current_user.id).id
    @report.user_id = current_user.id
    @report.company_id = current_user.company_id
    @report.amount = @reportparam[:amount]
    @report.isimport = false
    @report.isfinished = false
    @report.reportnumber =  ReportMain.where(:company_id => current_user.company_id, :isimport => false).count.to_i+1
    if @report.save
      @reporte.report_main_id = @report.id
    else
      redirect_to(:action => 'exportnew')
      return
    end

    @reporte.vrstaotpada = params[:vrstaotpada]
    @reporte.nacinpakovanja = params[:nacinpakovanja]
    @reporte.ispitivanjebroj = @reportparam[:ispitivanjebroj]
    @reporte.datumispitivanja = @reportparam[:datumispitivanja]
    @reporte.q_pripadnost = @reportparam[:q_pripadnost]
    @reporte.datumpredaje = @date

    if @reporte.save
      redirect_to(:action => 'show', :id => @reporte.id)
    else
      redirect_to(:action => 'exportnew')
    end
  end

1 Ответ

0 голосов
/ 08 марта 2011

Я думаю, что ваша проблема в этом случае в том, что вы используете redirect_to вместо render. Когда вы используете redirect_to, вы теряете все переменные из текущего действия. Я бы, вероятно, сделал что-то подобное в вашем действии:

if @reporte.save
  render :show
else
  render :exportnew
end

Когда вы используете render, он будет использовать переменные из текущего действия, но представление из действия, которое вы отправляете в метод render. Поэтому, когда form_for вызывается с переменной @report, она уже заполняется значениями, которые были отправлены для создания. Просто убедитесь, что вы используете одни и те же имена переменных в разных действиях, но похоже, что вы уже это делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...