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