Как мне привести другие переменные вместе с рендеринга? - PullRequest
0 голосов
/ 07 июня 2019

Я сделаю все возможное, чтобы правильно сформулировать этот вопрос!

Я пытаюсь сделать три разные формы на одной странице. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я выполняю «рендеринг» панели инструментов / индекса », она падает, потому что в других формах отсутствуют другие переменные экземпляра (например, @check = nil)

Если я изменю его на «redirect_to dashboard_path», он будет работать нормально при отправке правильной информации или если проверки не пройдены, но он потеряет всю другую информацию в форме после перенаправления.

Как мне привести другие переменные вместе с рендером?
или моя реализация не соответствует передовой практике? Есть ли лучший способ структурировать это?

Или я просто не задаю правильные вопросы?

Это не совсем тот же код, я пытался удалить весь несвязанный контент

в dashboard_controller.rb


def index

    @calibration = Calibration.new
    @blank = Blank.new
    @check = Check.new

    @last_calibration = Calibration.where(user_id: current_user.id).order(created_at: :asc).last
    @last_blank = Blank.where(user_id: current_user.id).order(created_at: :asc).last
    @last_check = Check.where(user_id: current_user.id).order(created_at: :asc).last

end

в index.html.erb

<% if @last_calbration&.complete? %>
    <%= render 'calibrations/form' %>
<% end %>

<% if @last_blank&.complete? %>
    <%= render 'blanks/form' %>
<% end %>

<% if @last_check&.complete? %>
    <%= render 'checks/form' %>
<% end %>

в blanks_controller.rb (и других контроллерах)

  def create
      @blank = Blank.new(blank_params)
      if @blank.save
        redirect_to dashboard_path
      else
        render "dashboard/index"
      end
  end

в _blanks_form.html.erb (и других формах)

  <%= form_for(@blank) do |f| %>
    ...
  <% end %>

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Хорошо, я думаю, что нашел решение, я изменил рендер на redirect_to и передал переменные, которые потерпели неудачу.Я не знаю, правильная ли это реализация, но, похоже, она работает.Если есть идеи получше, дайте мне знать!

в dashboard_controller.erb (я делал это для каждой формы, но только для 1 формы в этом случае) ...

def index
  @blank = Blank.new(blank_params[:blank])
end
...

private 
   def blank_params.permit( { blank: [ :user_id, :field1, :field2] } )

и в blanks_controller.rb (и во всех других контроллерах) ...


def create

 @blank = Blank.new(blank_params)
 if @blank.save
   redirect_to dashboard_path
 else
   redirect_to dashboard_path( blank: @blank.attributes )
  end

end
0 голосов
/ 07 июня 2019

Причина:

Причина вашей проблемы в том, что когда мы используем render, методы контроллера не выполняются. Например, если вы визуализируете шаблон show из метода index, то будет отображен только шаблон метода show, а фактический метод show не будет выполнен.

Причина, по которой он работает с перенаправлением, заключается в том, что redirect_to выполняет фактический метод контроллера.

Решение:

Что вы можете сделать, так это создать общий метод, который инициализирует эти переменные

Примерно так:

def initialize_variables

    @calibration = Calibration.new
    @blank = Blank.new
    @check = Check.new

    @last_calibration = Calibration.where(user_id: current_user.id).order(created_at: :asc).last
    @last_blank = Blank.where(user_id: current_user.id).order(created_at: :asc).last
    @last_check = Check.where(user_id: current_user.id).order(created_at: :asc).last

end

Теперь вы можете вызывать этот метод, используя before_action

before_action :initialize_variables, only: [:index, :create] // <- Here add the methods which require these variables

def index

    @calibration = Calibration.new
    @blank = Blank.new
    @check = Check.new

    @last_calibration = Calibration.where(user_id: current_user.id).order(created_at: :asc).last
    @last_blank = Blank.where(user_id: current_user.id).order(created_at: :asc).last
    @last_check = Check.where(user_id: current_user.id).order(created_at: :asc).last

end

Надеюсь, это поможет ...

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