Rails 5.2。从助手方法渲染js.erb部分

时间:2018-08-23 15:35:50

标签: javascript ruby-on-rails

我有一个名为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)

但是我没有显示闪光灯,而是在白屏上只显示了部分代码。

see the screenshot

由于我使用了response_to,因此出现了另一个错误:ActionController :: UnknownFormat

我需要执行alert.js.erb中的代码片段以渲染Flash,我认为窍门在render函数中的某个位置,但是谷歌搜索两个小时实在是浪费时间。

请帮助!预先谢谢你

3 个答案:

答案 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那样快速和美观,因为当用户提交问题时,整个页面将再次加载以显示错误警告。