如何将其他变量与渲染一起使用?

时间:2019-06-07 06:47:48

标签: ruby-on-rails

我会尽力正确地表达这个问题!

我正在尝试在一页上制作三种不同的表格。我遇到的问题是,当我“渲染“仪表板/索引””时,由于其他表单缺少其他实例变量(例如,@ check = nil)而导致崩溃

如果我将其更改为“ redirect_todashboard_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 :(得分:0)

原因:

出现问题的原因是因为当我们使用package com.myorg; @Command(name = "myapp") public class MyApp implements Runnable { @Option(names = {"-u", "--username"}, description = "user name") private String userName; @Command // subcommand "sub" public void sub(@Option(names = "--subcommand-options") String option) { System.out.printf("sub says hello %s!%n", userName); } @Override public void run() { System.out.printf("myapp says hi %s!%n", userName); } public static void main(String[] args) { int exitCode = new CommandLine(new MyApp()).execute(args); } } 时,不会执行控制器方法。例如,如果您从render方法渲染show模板,则仅show方法的模板将被渲染,而实际show方法将不被执行。

之所以使用重定向进行工作,是因为index执行了实际的控制器方法。

解决方案:

您可以做的是,创建一个初始化这些变量的通用方法

类似这样的东西:

redirect_to

现在您可以使用before_action

调用此方法
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

希望有帮助...

答案 1 :(得分:0)

好吧,我想我找到了一个解决方案,我将渲染更改为redirect_to并传递了失败的变量。我不知道这是否是正确的实现,但似乎可行。如果有更好的主意,请告诉我!

在dashboard_controller.erb中(我为每种表单都做了,但是在这种情况下只有一种形式)...

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