我会尽力正确地表达这个问题!
我正在尝试在一页上制作三种不同的表格。我遇到的问题是,当我“渲染“仪表板/索引””时,由于其他表单缺少其他实例变量(例如,@ 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 %>
答案 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