Jquery Rails:使用ajax从类别编辑页面创建与类别关联的项目

Jquery Rails:使用ajax从类别编辑页面创建与类别关联的项目,jquery,ruby-on-rails,ajax,ruby-on-rails-4,coffeescript,Jquery,Ruby On Rails,Ajax,Ruby On Rails 4,Coffeescript,项将被称为只接受名称的键 我之所以需要在categories edit视图中通过ajax添加键,是因为用户可以编辑categories items显示模板。在模板中,它有他们可以使用的键,因此当类别中的项目显示时,该项目的键值将显示在键名称的位置,例如(键“价格”将显示为$12) 与用户在不同的页面上创建键,然后编辑模板并意识到他们需要添加更多键并在页面之间切换不同,我决定将其放在一个页面上更好 我还没有使用过从不同视图到自己的controllers new.html.erb视图的create操

将被称为只接受名称的

我之所以需要在categories edit视图中通过ajax添加键,是因为用户可以编辑categories items显示模板。在模板中,它有他们可以使用的键,因此当类别中的项目显示时,该项目的键值将显示在键名称的位置,例如(键“价格”将显示为$12)

与用户在不同的页面上创建键,然后编辑模板并意识到他们需要添加更多键并在页面之间切换不同,我决定将其放在一个页面上更好

我还没有使用过从不同视图到自己的controllers new.html.erb视图的create操作,而且我对ajax还相当陌生。这是我得到的

类别有许多键,键属于类别

类别/edit.html.erb

<%= form_for([@guide, @category, @key_name], url: guide_category_path, remote: true) do |f| %>

   <%= f.label :name, "Key name" %>
   <%= f.text_field :name, { :name => 'key_input' } %>

   <%= f.submit "Add"  %>
<% end %>

  <div>

   <%= form_for([@guide, @category], url: guide_category_path) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>

   <%= f.label :name, "Category name" %>
   <%= f.text_field :name %>

   <%= f.label :template, "Template" %>    
   <%= f.text_area :template, { :id => 'edit' } %>

   <%= f.submit "Save"  %>

<% end %>
类别控制器编辑和更新操作

    def edit
     @guide = Guide.friendly.find(params[:guide_id])
     @category = Category.friendly.find params[:id]
     @keys = CategoryItemKey.where(category_id: @category.id).pluck(:name)
     gon.keys = @keys

      @key_name      = @category.category_item_keys.new


    end

    def update
    @guide = Guide.friendly.find(params[:guide_id])
    @category = Category.friendly.find params[:id]

    if @category.update category_params
        redirect_to new_guide_category_item_path(@guide, @category)
    else
        render 'edit'
    end
    @key_name      = @category.category_item_keys.new key_params

    end

    private

    def category_params

     if (current_user.mod_of_game?(@guide) unless current_user.nil?)
        params.require(:category).permit(:name, :template)
        else
        params.require(:check_category).permit(:name, :template)
        end

    end

    def key_params

       params.require(:category_item_key).permit(:name)

    end
路线

resources :guides do
    resources :categories,    only: [:new, :create, :edit, :update] do
       resources :category_item_keys, path: "keys", only: [:update, :new, :create] do
          get :edit, on: :collection #-> url.com/guides/:guide_id/:category_id/keys/edit
       end
    end
end

当我提交表单以添加一个新键时,它会将我带到CategoryItemsController show操作,并在其中一个变量上抛出一个record not found错误,不知道为什么它会转到该控制器

在表单处理程序中,无论表单是否有效,您都希望阻止默认事件,因为您不希望在任何情况下正常提交表单:

$('#form').submit (event) ->
   event.preventDefault()
   # ...
从传递给
.submit
的函数返回false将实现同样的效果-jQuery将防止事件冒泡

此外,您的验证在几个方面被破坏

$('.required').val().length == 0
将仅检查与选择器匹配的第一个元素。相反,您可以使用如下选择器:

$(this).find('.required[value=""]').length == 0

我认为您应该将
url:$(this.attr('action')
更改为
url:$('#form').attr('action')
,因为
不是该范围内的表单。谢谢,我更新了问题。现在,我转到CategoryItems控制器show action,并在其中一个变量上抛出一个记录not found错误。这是服务器端错误吗?说它无法在category items控制器中找到
@category=category.friendly.find(params[:category_id])
。但它一开始不应该在那个控制器里,我不能帮你解决RoR。可能您传递的id不在数据库中。另一方面,您的路由嵌套太深。资源嵌套深度不得超过1级。这导致表单、控制器等变得比需要的更复杂。
$(this).find('.required[value=""]').length == 0