我有一个名为Question的模型,它可以创建动作;
我的目标是在实例无效时使用助手方法(例如,show_alert
)立即显示即时消息。
question_controller.rb
def create
question = Question.new(question_params)
if question.save then
redirect_to show_question_path(question.id)
else
show_alert(:warning, question.errors)
end
end
application_controller.rb
helper_method :show_alert
def show_alert(type, message)
@type = type; @msg = message
respond_to do |format|
format.js { render :template => 'alert.js.erb'}
end
end
alert.js.erb
var div = $('<div></div>').addClass(`alert alert-${@type}`)
$('<ul></ul>').append( $('<li></li>').html(@msg)
div.append(ul)
$('#alerts').html(div)
但是我没有显示闪光灯,而是在白屏上只显示了部分代码。
由于我使用了response_to,因此出现了另一个错误:ActionController :: UnknownFormat
我需要执行alert.js.erb
中的代码片段以渲染Flash,我认为窍门在render
函数中的某个位置,但是谷歌搜索两个小时实在是浪费时间。
请帮助!预先谢谢你
答案 0 :(得分:0)
默认情况下,助手的所有输出均被转义。要按原样显示HTM1,您需要使用html_safe方法(https://apidock.com/rails/v4.2.1/String/html_safe)。参见Using helpers in a view escapes the html?
答案 1 :(得分:0)
我无法确定是否没有看到您的alert.js.erb,但这可能是您需要在alert.js.erb中使用escape_javascript
类似于您的alert.js.erb中的(并且我还没有测试过)
private void AddGroupBoxAndLables()
{
GroupBox groupBox1 = new GroupBox();
groupBox1.SetBounds(50, 50, 300, 200);
this.Controls.Add(groupBox1);
Label lblCompleted = new Label { Name = "lblCompleted", Text = "Completed" };
lblCompleted.Location = new Point(20, 20);
groupBox1.Controls.Add(lblCompleted);
Label valCompleted = new Label { Name = "valCompleted" };
valCompleted.Location = new Point(80, 20);
groupBox1.Controls.Add(valCompleted);
Label lblInProgress = new Label { Name = "lblInProgress", Text = "In Progress" };
lblInProgress.Location = new Point(20, 60);
groupBox1.Controls.Add(lblInProgress);
Label valInProgress = new Label { Name = "valInProgress" };
valInProgress.Location = new Point(80, 60);
groupBox1.Controls.Add(valInProgress);
}
您可以在Rails Guides - Working With Javascript in Rails
上了解更多信息希望这会有所帮助!
答案 2 :(得分:0)
ActionController::UnknownFormat error
之所以出现,是因为浏览器正在将HTML请求发送到Rails服务器,但是response_to块仅指定了来自Web服务器的javascript请求时的处理方法。
您将需要添加一些Ajax来实现所需的功能。请参阅有关Ajax的本教程。 https://www.tutorialspoint.com/ruby-on-rails/rails-and-ajax.htm
Ajax将在后台向浏览器发送一个js请求(即浏览器将不会刷新或显示任何加载迹象)。该js请求将发送到Rails服务器,并将包含脚本的.js.erb文件返回给浏览器。现在,由于浏览器返回了该脚本作为对Ajax请求的响应,因此浏览器已经知道需要执行的是javascript。
如果您不希望实现Ajax,则可以在create控制器中执行以下操作:-
def create
question = Question.new(question_params)
if question.save then
redirect_to show_question_path(question.id)
else
redirect_to new_question_path(error: question.errors) #new_question_path is the action that displays the question form to the user
end
end
,然后您可以在显示问题表单的操作中初始化错误变量。例如
def new
@error=params[:error]
#rest of the code...
end
然后在new.html.erb中的某个位置(或任何html.erb文件名)
<script>
<% if @error %>
var div = $('<div></div>').addClass(`alert alert-<%= @type %>`)
$('<ul></ul>').append( $('<li></li>').html(<%= @msg %>)
div.append(ul)
$('#alerts').html(div)
<% end %>
// you might need to tweak the variable names in controller or the above code
</script>
(上面的代码可能并不完美。它只是给你一个主意)
但是这种方法不会像ajax那样快速和美观,因为当用户提交问题时,整个页面将再次加载以显示错误警告。