在我的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和路径似乎是错误的。
答案 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服务设置会话数据。