如何通过[action] .js.erb remote:true ajax传递键值

时间:2016-11-15 18:24:52

标签: ruby-on-rails ajax

以下是使用键值显示Flash消息的方法。

application_html.erb
<div class="container-fluid">    
<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %>" data-turbolinks="false">
    <a class="close lay" data-dismiss="alert">&#215</a>
      <% if message.is_a?(String) %>
        <div id="flash_<%=message_type%>">
          <%= sanitize(message) %>
        </div>
      <% end %>  
   </div>
<% end %>
</div>

现在我在我的控制器中:

def saved 
  ...
  respond_to do |format| 
    format.js
  end
end

以我的形式:

<%= link_to... remote: true, method: :put %>

现在在我的saved.js.erb文件中,我有以下内容:

<% if request.put? %>
  <% response = current_user.saved_articles.new(article: @article) %>
  <% if !response.valid? %>
    FLASH SOMETHING HERE
  <% else %>
    <% response.save %>
    FLASH SOMETHING HERE
  <% end %>    
<% else request.delete? %>
  <% current_user.saveds.delete(@article) %>
  FLASH SOMETHING HERE 
<% end %> 

如何通知:&#34;您已保存此文&#34;并注意:&#34;你没有保存这篇文章&#34; ?

2 个答案:

答案 0 :(得分:1)

将Flash消息组件存储为部分并在 js.erb 文件中调用,如果您愿意,请在几秒钟后将其删除。

如果您打算将部分命名为 _flash.html.erb ,则需要注意一点,Flash对象值在部分内容中将变为零:

  

我发现这不适合我的原因是我有   将我的部分 flash命名为。显然Rails为其创建了一个局部变量   部分使用部分名称(不带“”字符。)所以我   有一个变量冲突。只要我将部分名称更改为   除了_flash之外的一切都很完美。 I found the answer here:Rails flash [:notice]总是nil

- 来自此SO post

application_html.erb:

<div class="container-fluid">    
  <%= render partial: 'shared/flash_messages' %>
</div>

共享/ _flash_messages.html.erb

<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %> flash_messages" data-turbolinks="false">
    <a class="close lay" data-dismiss="alert">&#215</a>
      <% if message.is_a?(String) %>
        <div id="flash_<%=message_type%>">
          <%= sanitize(message) %>
        </div>
      <% end %>  
   </div>
<% end %>

controller.rb

def saved 
  if saved?
    flash[:success] = "You have saved this article"
  else 
    flash[:danger] = "You have unsaved this article"
  end
  respond_to do |format| 
    format.js
  end
end

saved.js.erb

    <% if request.put? %>
      <% response = current_user.saved_articles.new(article: @article) %>
      <% if !response.valid? %>
        // append to any element
        $('body').append('<%= j render partial: "shared/flash_messages"%>').fadeOut(2000, function(){
   $('.flash_messages').remove();
});
      <% else %>
        <% response.save %>
        $('body').append('<%= j render partial: "shared/flash_messages"%>').fadeOut(2000, function(){
   $('.flash_messages').remove();
});
      <% end %>    
    <% else request.delete? %>
      <% current_user.saveds.delete(@article) %>
      $('body').append('<%= j render partial: "shared/flash_messages"%>').fadeOut(2000, function(){
   $('.flash_messages').remove();
});
    <% end %>

答案 1 :(得分:1)

实际节省saved行动?如果您要保存记录(或更新或删除),则应该(不必)使用createupdate以及destroy操作执行此操作。把所有事情都放在一个动作中就不是正确的方法,即使你正在操纵数据库记录......为什么不适当的CRUD:

def create
  # create logic
  render js: { model: @your_model, status: @your_model.persisted? : :ok, :unprocessable_entity }
end

(and other actions)

然后在您的js中,您可以询问异步呼叫状态,并从那里构建消息。