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

Rails - use AJAX to set session variable with link_to

本文关键字:to 设置 会话 变量 link 使用 AJAX Rails      更新时间:2023-09-26

在我的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中有javascript不是好的做法。erb文件,但我不能设置会话[:edit_survey]在js。咖啡文件。在那个文件中,我显然无法访问这个会话变量,也无法将其设置为"y"。但我确实需要设置这个会话变量因为在另一个视图中,我需要决定是新建还是编辑路径:

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]被设置为"y",即使编辑按钮没有被点击,我猜点击事件触发无论哪个按钮被点击。当用户决定点击新按钮时,他最终会编辑他之前的调查,而不是进行新的调查——我不希望这样。因此,我正在寻找一种解决方案,让用户决定是否要进行新的调查或编辑他之前的调查,然后他应该被发送到正确的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

编辑按钮所在的URL:

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

如果你需要知道:authenticate是仪表板的一个方法,那么它是:views> dashboard> authenticate.html.erb

任何帮助都很感激,因为我只是没有设法得到这个AJAX请求为我工作,无论我正在阅读多少线程。我试着用"get"代替"post",但它并没有让任何事情变得更好……方法调用正在工作,当我单击按钮并添加警报时,会显示警报,但是$。邮政和路线似乎是错误的。

当链接未被单击时,不会触发click事件。

你的问题是,javascript定义,甚至在html。Erb文件将在客户端的浏览器上运行,而会话只能在服务器上访问。实际上Ruby on Rails代码只运行在服务器上。

所以当你写:

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

动词在服务器上被解释。当它遇到以下代码:

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

会话设置为"y"。这是不包含在javascript代码的页面被发送到客户端,并在浏览器中使用。

更清楚地看到这一点的一种方法是加载页面并在浏览器中执行显示源代码。你会注意到javascript看起来像这样:

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

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