我将类别嵌套在指南中。我正在构建一个应用程序来更好地学习rails,我正在尝试创建一个页面,它将显示属于指南的所有类别,并在其下面编辑输入,并在其旁边有一个保存按钮,以便用户可以编辑他们想要改变的类别。
有点坚持如何完成这项工作。
这里是category_item_keys控制器
def edit
@guide = Guide.friendly.find(params[:guide_id])
@category = Category.friendly.find(params[:category_id])
@key = @category.category_item_keys
end
def update
@guide = Guide.friendly.find(params[:guide_id])
@category = Category.friendly.find(params[:category_id])
@key = @category.category_item_keys.friendly.find(key_params) # no idea what to make this equal because it isn't one set key being edited on the page
if @key = @category.category_item_keys.update_attributes(key_params)
flash[:success] = "Key updated"
redirect_to @guide
else
render 'edit'
end
end
private
def key_params
params.require(:category_item_key).permit(:key, :slug)
end
路由
match '/guides/:guide_id/:category_id/keys/edit' => 'category_item_keys#edit', :via => :get
match '/guides/:guide_id/:category_id/keys/' => 'category_item_keys#update', :via => :post, as: :category_item_keys_update
edit.html.erb
<ul>
<% @key.each do |key| %>
<li><%= key.key #just shows key name %><br>
<%= form_for([@category, @keys], url: category_item_keys_create_path) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :key, "Key name" %>
<%= f.text_field :key %>
<%= f.submit "Save" %>
<% end %>
</li>
<% end %>
</ul>
这只是给我一个错误:
undefined method `to_key' for #<CategoryItemKey::ActiveRecord_Associations_CollectionProxy:0x007fe20a86b480>
后来我计划使用就地编辑器gem,但我想知道如何做到这一点。
修改
修正了错误(将form_for([@category, @keys]
更改为form_for([@category, key]
,结果显示这种方式可以显示并允许在一定程度上编辑所有类别。
我提交表单时收到另一个错误
undefined method 'update_attribute'
编辑2
慢慢到那里。我将更新的@key变量更改为@key = @category.category_item_keys.all
以修复错误。但是这条线现在给我带来了问题
if @key = @category.category_item_keys.update_attributes(key_params)
“
第三次编辑
错误
Couldn't find CategoryItemKey without an ID
在线
@key = @category.category_item_keys.find params[:id]
PARAMATERS:
{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"egj/OebdSbxxaoaTkr46WVIOIIu4Ezijzu45kqxLT0krjFWHqi67SRJDSgV7bcL6SeoGpUSYsrolspylCXBu9g==",
"category_item_key"=>{"name"=>"def1111"},
"commit"=>"Save",
"guide_id"=>"dbz",
"category_id"=>"characters"}
答案 0 :(得分:1)
看起来您正在尝试对集合而不是对象执行update_attributes
。尝试先获取密钥对象
@key = @category.category_item_keys.friendly.find(params[:id])
然后尝试更新其属性
if @key.update_attributes(key_params)
...
end
答案 1 :(得分:1)
以下是如何清理代码:
#config/routes.rb
resources :guides do
resources :categories, path: "" do
resources :category_item_keys, path: "keys", only: [:update] do
get :edit, on: :collection #-> url.com/guides/:guide_id/:category_id/keys/edit
end
end
end
#app/controllers/keys_controller.rb
class KeysController < ApplicationController
def edit
@guide = Guide.find params[:guide_id]
@category = Category.find params[:category_id]
@keys = @category.category_item_keys
end
def update
@guide = Guide.find params[:guide_id]
@category = Category.find params[:category_id]
@key = @category.category_item_keys.find params[:id]
if @key.update key_params
redirect_to @guide, success: "Key Updated"
else
render 'edit'
end
end
private
def key_params
params.require(:category_item_key).permit(:key)
end
end
#app/views/keys/edit.html.erb
<% @keys.each do |key| %>
<%= form_for [@guide, @category, key] do |f| %>
<%= f.text_field :key %>
<%= f.submit %>
<% end %>
<% end %>
如果您想使用in-place
编辑器宝石,我建议您查看X-Editable
,因为我们已经应用了here(它只是一个演示应用,只需免费注册并转到个人资料):
答案 2 :(得分:0)
使用rails 4中提供的nested forms。