ruby-on-rails – 使用Ruby on Rails在JSON Feed中渲染动态变量

我只是在为客户创建一个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中打破这些变量?

如果不是,那么有人可以推荐一种更好的方法来实现它.

最佳答案 为什么不在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));
      }

    })
 })

希望这个帮助

不确定你想要什么样的form_tag的简单Form html标签intead,因为它不包含真实性令牌

希望这有帮助

点赞