返回渲染部分并显示闪烁

时间:2013-12-10 12:05:31

标签: ruby-on-rails ruby flash render partial

我有一部分功能“告诉朋友一些事情”。 我想让用户知道一切是否正常所以我回到控制器中显示闪烁。

问题是我可以通过pry(调试器)看到闪烁,但屏幕上没有显示任何内容。

如下图所示:

撬结果 Pry results

**重要提示:**告诉朋友是点击链接时打开的页面。该链接打开一个索引页面,打开一个部分。

我尝试了不同的东西:

  • return render:index
  • 渲染:索引
  • 重定向
  • ...

index.html.erb文件:

<!doctype html>
<html lang="nl">
  <head>
    <meta charset="utf-8" />
    <title><%= t("share.index.header") %></title>
    <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
    <%= javascript_include_tag "application" %>
    <%= stylesheet_link_tag "application", :media => "all" %>
    <style>
      body {
        margin: 2em;
        font: 14px/1em 'open-sans', sans-serif;
        color: #333;
        background: #eee;
      }
      h1 {
        font-weight: normal;
        color: #666;
      }
      p {
        color: #666;
        font-size: 12px;
        margin: 0 0 3em 0;
      }
      p a {
        color: #333;
        text-decoration: none;
        border-bottom: 1px dotted #666;
      }
      form {
        position: relative;
      }
      .col-2 {
        position: absolute;
        top: 0; left: 25em;
      }
      label {
        display: block;
        margin: 0 0 2em 0;
      }
      strong {
        font-weight: normal;
        display: block;
        margin: 0 0 .5em 0;
      }
      input[type=text] {
        padding: 6px;
        width: 25em;
        border: 1px solid #ccc;
        background: #fff;
      }
      input[type=submit] {
        color: white;
        font-size: 14px;
        padding: .75em;
      }
    </style>
  </head>
  <body>
    <div id="wrap">
      <% if current_user %>
        <%= render :partial => "signed_in_user" %>
      <% else %>
        <%= render :partial => "anonymous_user" %>
      <% end %>
    </div>
  <script>
  </script>
  </body>
</html>

signed_in_user partial:

  <script type="text/javascript"charset="UTF-8">
    $(document).ready(function() {
        $( "#submitBtn" ).click(function() {
          // Simple input Validation
          var emailaddress =  $( "#email").val();
          if( !validateEmail(emailaddress)) { 
            $( "#validationerror").show();
            return false;
           };
        });

        function validateEmail($email) {
          var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
          if ($email == '' ){
            return false;
          } else {
            if( !emailReg.test( $email ) ) {
              return false;
            } else {
              return true;
            }
           };
       };
      });
  </script>
<!-- Why is this code not showing after return render -->
<!-- Why is this code not showing after return render -->
<!-- Why is this code not showing after return render -->
<p><%= flash[:notice]  %></p>
<!-- Why is this code not showing after return render -->
<!-- Why is this code not showing after return render -->
<!-- Why is this code not showing after return render -->
<h1><%= t :header, :scope => [:share, :index] %></h1>
<p><%= t :link_to_page_html, :scope => [:share, :index], :link => link_to(truncate(job_url(params[:job_id]),length: 50, omission: '...'), job_path(params[:job_id])) %></p>
<%= form_tag(job_share_index_path(params[:job_id]), :method => "post", :id => "myform", :remote => true) do %>
  <%= hidden_field_tag "guid", params[:job_id] %>
  <div class="col-1">
    <label>
      <strong><%= t("share.index.name") %></strong>
      <%= text_field_tag "fullname", "", :autofocus => "autofocus" %>
    </label>
    <label>
      <strong><%= t("share.index.email") %></strong>
      <%= content_tag(:p,  t("share.index.valid_email") , :id => "validationerror", :class => 'small_label' , :style => "display: none;color: red; font-weight: bold;") %>
      <%= text_field_tag "email", "", :placeholder => t("share.index.email_placeholder"), :id => "email" %>
    </label>
  </div> <!-- /.col-1 -->
  <div class="col-2">
    <label>
      <strong><%= t("share.index.message") %></strong>
      <%= text_area_tag "message", "", :style => "width: 370px; height: 175px;"%>
    </label>
  </div> <!-- /.col-1 -->
  <%= submit_tag t("share.index.button"), :class => "medium button", :id => "submitBtn" %>
<% end %>

共享控制器

class ShareController < ApplicationController

  def index
    render :layout => false
  end

  def create
    Sap.tell_a_friend(params[:fullname], params[:message], params[:guid], params[:email], api_params_for_user)

    # respond_to do |format|
    #   format.html { redirect_to(job_share_index_path) }
    #   format.js
    # end

    flash[:notice] ="test"
    return render :index
  end

end

3 个答案:

答案 0 :(得分:1)

flash适用于 next 操作/页面视图/请求中应显示的消息。您试图以与设置相同的动作渲染闪光灯,但这不起作用。

您需要使用flash.now来设置Flash消息:

  

此方法使您可以将Flash用作应用程序中的中央邮件系统。当您需要将对象传递给下一个操作时,使用标准flash assign([] =)。当你需要将一个对象传递给当前动作时,你现在就使用了,当你的当前动作完成后你的对象就会消失。

即:

flash.now[:notice] ="test" # or flash.now.notice = "test"

答案 1 :(得分:1)

像这样获取你的Flash: <%= content_tag :div, flash[:notice] %>

答案 2 :(得分:0)

首先,我要感谢Zendist(AndreasBjørn)和Jakob S.

我在想,因为它只告诉朋友功能,唯一真正需要验证的是验证电子邮件。

因此,如果他的电子邮件地址有效,我只需通过javascript向用户返回一条消息,而不是通过rails返回flash消息。

如下所示:

 $( "#submitBtn" ).click(function() {
          // Simple input Validation
          var emailaddress =  $( "#email").val();
          if( !validateEmail(emailaddress)) { 
            $( "#validationerror").show();
            return false;
           } else {
                $( "#validationnotice").text("hello world");
           };
        });

再次感谢您的输入和帮助#greatcommunity!