Rails - 使用AJAX通过link_to设置会话变量

时间:2014-06-03 18:18:35

标签: javascript ruby-on-rails events click link-to

在我的rails应用程序中,我有一个包含两个链接的视图:

authenticate.html.erb:
<%= link_to t('.start_new'), edit_registration_path, id: "new-button", class: "btn btn-default" %>
<% unless @organisation_survey.blank? %>
  <%= link_to t('.start_edit'), edit_registration_path, id: "edit-button", class: "btn btn-default" %>
<% end %>

第一个应该向用户发送新的调查,而第二个应该让他编辑他之前的调查。两者都应该首先将用户发送到edit_registration_path,因为在这两种情况下用户都已登录并可以编辑他的姓名,电子邮件等。 如果用户单击第二个链接以编辑其先前的调查,则应设置会话变量:

authenticate.html.erb:  
<script type="text/javascript">
  $('edit-button').observe('click', function (event) {
    <% session[:edit_survey] = "y" %>
    event.stop();
  });
</script>

我知道在html.erb文件中使用javascript并不好,但是我无法在js.coffee文件中设置会话[:edit_survey]。在该文件中,我显然无法访问此会话变量,我无法将其设置为&#34; y&#34;。但我真的需要设置这个会话变量,因为在另一个视图中我需要在新路径和编辑路径之间做出决定:

questions_info.html.erb:
<% if session[:edit_survey] == "y" %>
  <%= link_to t('.start'), edit_question_path(1), class: "btn btn-default" %>
<% else %>  
  <%= link_to t('.start'), new_question_path(1), class: "btn btn-default" %>
<% end %> 

如果用户单击第一页上的编辑按钮,则转到edit_question_path(1),如果单击新按钮,则转到new_question_path(1)。

目前会话[:edit_survey]设置为&#34; y&#34;即使没有点击编辑按钮,我想无论点击哪个按钮,点击事件都会触发。当用户决定点击新按钮时,他将结束编辑他之前的调查,而不是进行新的调查 - 我不想要这个。因此,我正在寻找一个解决方案,让用户决定是否要进行新的调查或编辑他之前的调查,然后他应该被发送到正确的question_path。因为在第一页和这两个按钮之间有一些页面和问题我不能使用参数...任何想法都值得赞赏。

编辑:现在我知道javascript不是问题,而不是我应该使用一些AJAX。我现在尝试了很多解决方案,但现在从未设置变量。

authenticate.html.erb:

<%= link_to t('.start_edit'), edit_registration_path, id: "edit-button", class: "btn btn-default" %>

dashboard.js.coffee:

`$(document).ready(function(){
  $("#edit-button").click(function() {  
    $.post('/authenticate');
  });
});`

routes.rb中:

post '/authenticate' => 'dashboard#set_edit_var'

dashboard_controller.rb:

def set_edit_var
  session[:edit_survey] = "y"
end

编辑按钮所在的网址:

http://localhost:3000/dashboard/XT0Epg0BAWRktZ-By-xsKw/authenticate

如果您需要知道:authenticate是一种仪表板方法,那么它是:views&gt;仪表板&gt; authenticate.html.erb

任何帮助都表示赞赏,因为无论我阅读多少线程,我都无法让这个AJAX请求为我工作。我试过&#34;得到&#34;而不是&#34; post&#34;但它并没有做得更好......方法调用正常,当我点击按钮并添加警报时会显示警报,但$ .post和路径似乎是错误的。

1 个答案:

答案 0 :(得分:5)

如果未点击链接,则不会触发点击事件。

你的问题是,即使在html.erb文件中定义的javascript也会在客户端的浏览器上运行,并且会话只能在服务器上访问。事实上,Ruby on Rails代码只能在服务器上运行。

所以当你写:

<script type="text/javascript">
  $('edit-button').observe('click', function (event) {
    <% session[:edit_survey] = "y" %>
    event.stop();
  });
</script>

erb在服务器上解释。当它遇到代码时:

<% session[:edit_survey] = "y" %>

会话设置为&#34; y&#34;。这不包含在发送到客户端并在浏览器中使用的页面的javascript代码中。

更清楚地看到这一点的一种方法是加载页面并在浏览器中执行show source。您会注意到javascript如下所示:

<script type="text/javascript">
  $('edit-button').observe('click', function (event) {
    event.stop();
  });
</script>

您需要做的是对服务器进行AJAX调用,并让AJAX调用的Web服务设置会话数据。