如何将变量传递给用户单击div时加载的部分?

时间:2014-06-26 10:30:29

标签: javascript jquery ruby-on-rails

我试图在用户点击div元素时加载部分。我的问题是我想将变量传递给这个部分,我找不到办法。

我写了以下代码:

<script>
$(".conversation").click(function() {
<% @conversationId = capture do %>
<%= javascript_tag "$(this).attr('id');" %>
<% end %>
$("#conversation").html("<%= escape_javascript(render(:partial => 'conversations/conversation_home', :locals =>{:conversation => Conversation.find_by_id(@conversationId)} )) %>");
});
</script>

我正在尝试初始化varialbe(@conversationId),然后使用它将我想要的对象传递给partial。 当我加载我的页面时,它也尝试加载部分(为什么?我没有点击任何地方),我得到了一个未定义的方法`subject&#39;为零:NilClass&#34;因为谈话是零。 如果我将@conversationId替换为值会话,则会正确初始化。

为什么在我加载页面时部分渲染,而不是在我点击div之后?我是否正确初始化@conversationId?

我可以采取另一种方法吗?

1 个答案:

答案 0 :(得分:2)

页面加载时会评估<%%>之间的任何内容。这是预期的行为,这就是为什么你的部分加载页面加载。

使用AJAX

我个人会使用AJAX。我就是这样做的。

在HTML中(为每个会话添加一个div及其id

<div class="conversation" data-conversation-url="<%= conversation_path(:id => 1) %>">Get Conversation</div>

在Javascript中(我会把它放在一个单独的文件中)

    $(document).on('click', '.conversation', function() {
        $.get({
            url: $(this).data('conversation-url'),
            success: function() {
              // do something here
            },
            failure: function() {
              // do something here
            }
        });
    });

在conversations_controller中

    def show
        @conversation = Conversation.find(params[:id])
    end

在views / conversations / show.js.erb

$("#conversation").html("<%= escape_javascript(render(:partial => 'conversation_home', :locals =>{:conversation => @conversation} )) %>");

这应该可以解决问题。

请注意,这假设您已为conversation_path设置了路线。 此外,这只是一个示例代码。您将不得不修改它以满足您的需要,添加错误处理,并可能根据您使用的jQuery和Rails版本更改一些代码。