Rails:就地编辑是一件事,但就地创建呢?

时间:2016-01-20 04:26:16

标签: ruby-on-rails ruby-on-rails-4 rubygems

我知道in-place editing是件事。但是我该如何进行创建。

我将items与某个类别相关联。如果我希望页面显示类别x中的所有项目,并且让用户能够从类别页面添加新项目,并且类别更新中的项目列表将显示添加的所有项目,而不是页面做了全面刷新我将如何做到这一点?

这种东西有宝石吗?

1 个答案:

答案 0 :(得分:0)

是的,宝石被称为Cocoon(如果你有nested fields)。

-

它可以(手动)这样工作:

#config/routes.rb
resources :posts do
   resources :categories, only: [:new, :destroy] #-> url.com/posts/:post_id/categories
end

#app/controllers/posts_controller.rb
class PostsController < ApplicationController
   def show
      @post = Post.find params[:id]
   end
end

#app/controllers/categories_controller.rb
class CategoriesController < ApplicationController
   respond_to :js, :html, only: :new

   def new
      @post = Post.find params[:post_id]
      @post.categories.build
   end

   def destroy
      @post = Post.find params[:post_id]
      @category = Category.find params[:id]

      @post.categories.delete @category
   end
end

#app/views/categories/new.js.erb
$category = $("<%=j render "form", locals: { post: @post } %>");
$($category.html()).appendTo(".categories");

#app/views/categories/_form.html.erb
<%= form_for post do |f| %>
   <%= f.fields_for :categories, child_index: Time.now.to_i do |category| %>
      <%= category.text_field :x %>
   <% end %>
<% end %>

#app/views/categories/new.html.erb
<%= form_for @post, remote: true do |f| %>
   <div class="categories">
       <%= f.fields_for :categories do |category| %>
           <%= category.text_field :x %>
       <% end %>
   </div>
   <%= link_to post_new_categories_path(@post), remote: true %>
   <%= f.submit %>
<% end %>

这会通过ajax将新项目添加到您的posts#show视图中。它应该工作,虽然可能需要调整一点。