【问题标题】:rendering a form through jquery in rails在rails中通过jquery渲染表单
【发布时间】:2014-01-11 23:36:34
【问题描述】:

我有这个应用程序,其中我有任务和子任务。每个任务都有一个添加子任务按钮,单击它会转到放置在 application.html.erb 文件中的 jquery 脚本。然后附加一个 p 标签来保存我的新子任务。现在想要的是而不是那段,我希望它显示一个小的子任务创建表单,仅包含 :name 文本字段和一个保存按钮,这将把它作为我的子任务控制器的创建操作。

记住每个子任务都属于一个任务

这就是我现在创建子任务的方式

<% provide(:title,'ToDoProject') %>
<% flash.each do |key,value| %>
<div class="alert alert-<%=key %>"><%=value %></div>
<%end%>
<h1>Create a subtask</h1>
<div class="container-fluid">
<div class="row-fluid">
<div class="span7">
    <%=form_for [@task,@subtask] do |s| %>

    <%=s.label :name %>
    <%=s.text_field :name,autofocus:'true' %>
    <%=s.submit "Save",class:'btn btn-success'%>
    <%end%>
</div>
</div>
</div>

我想要这个相同的表单,但是当用户点击添加我的任务的新子任务时动态显示,以便用户可以为子任务命名,然后点击保存,它将被保存到我的数据库。

但这一切都需要通过 jquery 并使用它的 append 函数。

这里是新更新的 show.html.erb,带有子任务表单和添加卡片按钮,使其可见

<div class="subtaskform" id="subtask_form_<%=task.id %>" style="width:218px;margin:0 2px 0px 3px;">

                <%= form_for([task, task.subtasks.build]) do |f| %>

                        <%= f.text_area :name,rows:'3',cols:'3'%>


                <%= f.submit "save",class:'btn btn-success' %>
                <a data-id='<%=task.id %>' href="#"><i class="fa fa-times fa-lg"></i></a>

                <% end %>

                </div>



                <p class="addcard" id="addcard_<%=task.id%>"><a href="#" data-id='<%= task.id %>' id='add_card_<%= task.id %>'>Add a card...</a></p>

这里是jquery代码

 $('.addcard > a').click(function(e){

          $('#subtask_form_' + $(this).data('id')).show(1000);

e.preventDefault();
   });

          $('.subtaskform a').click(function(e){
           $('#subtask_form_' + $(this).data('id')).hide(1000);
          e.preventDefault();
         });

【问题讨论】:

    标签: jquery ruby-on-rails


    【解决方案1】:

    我认为你需要使用Ajax


    流程

    基本上,您正在尝试执行类似this 的操作 - 从您的 Rails 服务器加载动态数据

    问题是如果没有中介技术发送asynchronous requests,您无法从Rails 动态加载数据

    简单来说,您的客户端是 HTML 和 JS,其中之一需要向您的 Rails 服务器发送请求,在您的视图中呈现响应


    代码

    #config/routes.rb
    resources :tasks do
        resources :subtasks #creates /tasks/1/subtasks/new etc
    end
    
    #app/views/tasks/index.html.erb
    <% @tasks.each do |task| %>
        <%= task.name %>
        <%= button_to "New Subtask", new_tasks_subtasks_path(task.id), remote: :true %>
    <% end %>
    
    #app/controllers/subtasks_controller.rb
    respond_to :html, :js
    
    def new
        @task = params[:task_id]
        @subtask = SubTask.new
    end
    
    def create
        @subtask = Subtask.new(subtask_params)
        @subtask.save
    end
    
    private
    def subtask_params
       params.require(:subtask).permit(:name, :etc)
    end
    
    #app/views/subtasks/new.html.erb
    <%= form_for [@task,@subtask] do |s| %>
        <%=s.label :name %>
        <%=s.text_field :name,autofocus:'true' %>
        <%=s.submit "Save",class:'btn btn-success'%>
    <% end %>
    
    #app/views/subtasks/new.js.erb
    $(".parent_div").append("<%=j render "new", layout: false %>")
    

    【讨论】:

    • 谢谢你的回复 Rich peck,但我想出了另一种方法,我现在正在做的是我隐藏了创建子任务的形式,当用户点击添加时子任务,它的可见性使用 jquery 更改。一切正常我也能够保存子任务。现在我正在搜索添加新子任务后如何刷新我的 div 任务的内容。我想我需要 ajax . 只是现在才在谷歌上搜索
    • 没问题!如果您需要任何进一步的帮助,请告诉我:)
    • 似乎 ajax 超出了我的想象。你有没有适合我的简单 ajax 脚本
    • 你需要它做什么?
    • c 现在我有这个 add_card 按钮,它使创建新子任务的表单可见。所以现在我可以在该表单中为我的新子任务编写任何内容,然后单击保存按钮并保存我的子任务.我只是希望它反映任务 div 中新保存的子任务。我不必刷新页面,现在我需要刷新但我不希望这样,我读到它只能通过 ajax 实现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2015-07-13
    • 1970-01-01
    • 2016-07-30
    • 2015-04-30
    相关资源
    最近更新 更多