6

使用 rails 4 和 ruby​​ 2

无法显示来自我的控制器的闪存消息。我的方法如下所示:

def create
    @salary_report = SalaryReport.create(salary_report_params)
    if @salary_report.save  
      redirect_to @salary_report
      flash[:notice] = "Lönerapporten sparades korrekt!"
      puts "salary report saved #{flash[:notice]}"
    else
      render :new, notice: "Något gick fel när lönerapporten skulle sparas!"      
    end
  end

如您所见,我添加了一个打印出 flash 通知的 puts 语句,只是为了证明 flash 通知是在重定向之后生成的。

创建工资报告后的日志如下所示:

Redirected to http://localhost:3000/salary_reports/20
salary report saved Lönerapporten sparades korrekt!
Completed 302 Found in 25ms (ActiveRecord: 9.7ms)

显示查看日志后:

Started GET "/salary_reports/22" for 127.0.0.1 at 2013-07-24 16:08:42 +0200
Processing by SalaryReportController#show as HTML
  Parameters: {"id"=>"22"}
  SalaryReport Load (0.5ms)  SELECT "salary_reports".* FROM "salary_reports" WHERE         "salary_reports"."id" = ? LIMIT 1  [["id", "22"]]
  Document Lo ad (0.3ms)  SELECT "documents".* FROM "documents" WHERE          "documents"."salary_report_id" = ?  [["salary_report_id", 22]]
  Rendered salary_report/show.html.erb within layouts/application (6.1ms)
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 3 ORDER BY     "users"."id" ASC LIMIT 1
Completed 200 OK in 62ms (Views: 58.0ms | ActiveRecord: 1.1ms)

在视图中,我显示以下消息:

<% flash.each do |name, msg| %>
      <% if msg.is_a?(String) %>
        <div class="alert alert-<%= name == :notice ? "success" : "error" %>">
          <a class="close" data-dismiss="alert">&#215;</a>
          <%= content_tag :div, msg, :id => "flash_#{name}" %>
        </div>
      <% end %>
    <% end %>

我尝试了各种不同的方法来编写控制器方法,但似乎没有任何帮助。非常不确定问题可能是什么。

4

5 回答 5

5

您正在设置您的flash[:notice]后重定向。尝试切换这些调用的顺序,即先设置 flash 消息,然后再重定向:

def create
    @salary_report = SalaryReport.create(salary_report_params)
    if @salary_report.save  
      flash[:notice] = "Lönerapporten sparades korrekt!"
      puts "salary report saved #{flash[:notice]}"
      redirect_to @salary_report
    else
      render :new, notice: "Något gick fel när lönerapporten skulle sparas!"      
    end
  end
于 2013-07-24T13:56:18.277 回答
0

由于设计 gem,我遇到了同样的问题,我找到了使用 cookie 的解决方案。

您必须在重定向之前设置一个带有值的 cookie,然后控制器测试是否有 cookie。如果是,它会测试它的值是多少并显示闪烁消息。

看看那里的完整解释: flash[:notice] not working with the after_sign_out_path_for - (devise)

希望它可以帮助你。

于 2013-11-20T16:18:49.623 回答
0

尝试在重定向子句中定义 flash 消息:

def create
  @salary_report = SalaryReport.create(salary_report_params)
  if @salary_report.save  
    redirect_to @salary_report, notice: "Lönerapporten sparades korrekt!"
  else
    render :new, notice: "Något gick fel när lönerapporten skulle sparas!"      
  end
end
于 2013-07-24T13:33:59.210 回答
0

尝试使用 flash.keep。

你放在闪光灯里的任何东西都会暴露在下一个动作中,然后被清除。

在这种情况下,flash 传递到 2 个动作,另一个控制器和一个视图。

def create
  @salary_report = SalaryReport.create(salary_report_params)
  if @salary_report.save  
    flash.keep[:notice] = "Lönerapporten sparades korrekt!"
    puts "salary report saved #{flash[:notice]}"
    redirect_to @salary_report
  else
    render :new, notice: "Något gick fel när lönerapporten skulle sparas!"      
  end
end
于 2013-07-24T16:26:50.007 回答
0

首先,不要单独定义 flash 消息,而是将其与重定向内联,就像您在下面的渲染行中所做的那样。这更像是一种风格变化,而不是任何主要功能:

def create
  @salary_report = SalaryReport.create(salary_report_params)
  if @salary_report.save  
    redirect_to @salary_report, notice: "Lönerapporten sparades korrekt!"
  else
    render :new, notice: "Något gick fel när lönerapporten skulle sparas!"      
  end
end

至于它不显示的原因,这很可能是您的 Flash 消息视图代码的问题。这是因为,正如您所测试的,闪存哈希设置正确,只是没有显示。

尝试使用以下更简单的版本临时替换您的 Flash 消息代码。确保它位于靠近顶部的 application.html.erb 中,但这又只是样式:

<% flash.each do |name, msg| %>
  <%= content_tag :p, msg if msg.is_a?(String) %>
<% end %>
于 2013-10-29T21:58:12.987 回答