使用Ruby on Rails在JSON Feed中呈现动态变量

4

我正在考虑为我们的客户创建一个API,让他们与我们的主要Rails 3应用程序进行交互。

首先,我希望json响应包含一些表单。基本上是一些我们控制并出现在他们网站上的表单代码。

我已经实现了这个(简化版):

def login_form
  @response = Form.find_by_something(params[:something_else])
  if @response 
    render :status=>200, :json=>{:response => @response} 
  end
end

在客户端,我可以获取:

@logins = HTTParty.get("#{set_auth_url}/api/v1/logins.json?auth_token=xyz&something_else=abc").parsed_response

并显示表单
= @logins["response"].html_safe

问题在于,表单代码中有一些动态变量:
例如:
<div class="login">
  <FORM name="form1" METHOD="get" action="<%= request.path %>?">
  <INPUT TYPE="HIDDEN" NAME="chal" VALUE="<%= params['challenge'] %>">
  <% if @current_location['success_url'] %>
    <INPUT TYPE="HIDDEN" NAME="userurl" VALUE="/success">
  <% end %>
  <input type="hidden" name="UserName" placeholder="Username" value="<%= @user['username']['username'] %>">
  <input type="submit" name="login" value="Login" class="btn">
</div>

我想知道这是否是一个好主意?如果是,如何在html中拆分这些变量?

如果不是,有人能推荐更好的方法吗?


那么你是将HTML模板存储在数据库中,并将它们返回给客户端以在其网页中呈现?只是为了确认一下。 - rewritten
嘿。只需要表单代码的部分。 - simonmorley
@simonmorley 表单数据是否保持不变,而不考虑实际内容?使用JavaScript模板有更好的解决方案。 - Viren
看起来表单应该是一个视图。表单 HTML 被存储在数据库中是否有任何原因? - superluminary
2个回答

1
为什么不像Jquery模板或Mustache或Handlebar一样使用JavaScript模板?
因此,将表单保留在客户端上,如下所示。
我将在这里使用Mustache来描述它
...
...

    <script id="template" type="text/template">
      <div class="login">
      <FORM name="form1" METHOD="get" action={{request_path}}>
      <INPUT TYPE="HIDDEN" NAME="chal" VALUE={{challenges}}>
      {{boolean_value}} 
      <INPUT TYPE="HIDDEN" NAME="userurl" VALUE="/success">
      {{/boolean_value}}
      <input type="hidden" name="UserName" placeholder="Username" value={{user_name}}>
      <input type="submit" name="login" value="Login" class="btn">
     </div>
    </script>

</html>

接下来是以ajax形式获取响应的部分

我猜可以使用任何JavaScript框架来实现,我在这里使用jQuery

<script type="text/javascript">
  $(document).ready(function() {
    $.ajax({
      // make ajax call over here
      success: function(data)  {
        // JSON DATA 
         var template = $('script#template').html();
         $([container where html is place]).html(Mustache.to_html(template,data));
      }

    })
 })

希望这可以帮到您

不确定您是否想要使用普通的表单HTML标签而不是form_tag,因为它不包含真实性令牌

希望这可以帮到您


谢谢回复。我以前没用过这两个东西。但是我对如何请求感到困惑?我需要他们的GET请求将整个表单拉下来。 - simonmorley
我花了一些时间才开始处理这个问题,很抱歉我不能授予您赏金。目前还不确定是否完全正确,但已经接近了。再次感谢。 - simonmorley

1

在准备响应时,这些变量是否在服务器端已知?如果是这样,我会尝试通过模板引擎运行它们 :json=> { :response => ERB.new(@response).result(binding) } - 客户端只会收到适用于他的情况的 HTML。


嘿,谢谢。这是否意味着我将标准变量留在text_input中?Rails会处理剩下的部分吗? - simonmorley
那个可以工作,但是有些代码从URL中提取参数。 <%= params ['challenge']%> 这不会被渲染。如何获取这些参数的方法是什么? - simonmorley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接