编辑页面以显示所有类别名称,每个类别名称上都有编辑输入 [英] Edit page to display all category names with edit inputs on each
问题描述
我的类别嵌套在指南中。我正在构建一个应用程序,以更好地学习Rails,并且正在尝试制作一个页面,该页面将显示属于指南的所有类别,并在其下具有编辑输入,并在其旁边有一个保存按钮,以便用户可以编辑他们想要更改的类别。
对于完成操作的确切方式有所了解。
这是category_item_keys控制器
def编辑
@guide = Guide.friendly.find(params [:guide_id])
@category = Category.friendly.find(params [:category_id])
@key = @ category.category_item_keys
结束
def更新
@guide = Guide.friendly.find(params [:guide_id])
@category = Category.friendly.find(params [:category_id])
@key = @ category.category_item_keys.friendly.find( key_params)#不知道如何使它相等,因为如果@key = @ category.category.itegory_item_keys.update_attributes(key_params)$ b,则不是在页面上编辑的一组键
$ b flash [:success] =密钥已更新
redirect_to @guide
否则
渲染编辑
结束
结束
私人
def key_params
params.require(:category_item_key).permit(:key,:slug)
结束
路线
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#只是显示键名%>< br>
<%= form_for([@ category,@keys],url:category_item_keys_create_path)做| f | %>
<%=呈现 shared / error_messages,对象:f.object%>
<%= f.label:key,键名%>
<%= f.text_field:key%>
<%= f。提交保存%>
<%end%>
< / li>
<%end%>
< / ul>
这只是给我一个错误:
#< CategoryItemKey :: ActiveRecord_Associations_CollectionProxy:0x007fe20a86b480>的未定义方法 to_key
稍后我计划使用就地编辑器gem,但我想学习如何使用
编辑:
修正了错误(已更改 form_for([[@ category,@keys]
到 form_for([@ category,key]
,结果证明这种方式可用于显示和
我在提交表单
undefined method时遇到另一个错误update_attribute'
EDIT 2
慢慢到达。我将update @key变量更改为 @key = @ category.category_item_keys.all
来修复该错误,但是此行现在给我带来了问题
if @key = @ category.category_item_keys.update_attributes(key_params)
'
第三次编辑
错误
找不到没有ID $ b的CategoryItemKey $ b
在线
@key = @ category.category_item_keys.find params [:id]
参数:
{ utf8 =>✓, _method => patch, authenticity_token =>> egj / OebdSbxxaoaTkr46WVIOIIu4Ezijzu45kqxLT0krjFWHqi67SRJDSgV7bcL_S $ go_b_L_Cy_b = L_S $ Cy_b = L_S $ Cy_b = L_S_Center = $ C_B_L_S_Y = $ C_B_L_S_Y == B name => def1111},
commit => Save,
guide_id => dbz,
category_id =>个字符}
以下是清理代码的方法:
#config / routes.rb
资源:指南执行
资源:类别,路径:做
资源:category_item_keys,路径:键,仅:[:update]做
得到:edit,on::collection#-> url.com/guides/:guide_id/:category_id/keys/edit
结束
结束
结束
#app / controllers / keys_controller.rb
KeysController类< ApplicationController
def编辑
@guide = Guide.find params [:guide_id]
@category = Category.find params [:category_id]
@keys = @ category.category_item_keys
结束
def更新
@guide = Guide.find params [:guide_id]
@category = Category.find params [:category_id]
@key = @ category.category_item_keys.find params [:id]
如果@ key.update key_params
redirect_to @guide,成功:键已更新
否则
render'编辑'
结束
结束
私人
def key_params
params.require(:category_item_key).permit(:key)
结束
结束
#app / views / keys / edit.html.erb
<%@ keys.each | key | %>
<%= form_for [@guide,@category,key]做| f | %>
<%= f.text_field:key%>
<%= f.submit%>
<%end%>
<%end%>
如果您想使用就地
编辑器,我建议您查看
I have categories nested inside of guides. I'm building an app to learn rails better and I'm trying to make a page that will display all categories that belong to a guide and have edit inputs under them and a save button next to it so the user can edit the names of the categories they want to change.
Bit stuck on how exactly how get this done.
here is the category_item_keys controller
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
routes
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>
This just gives me an error of:
undefined method `to_key' for #<CategoryItemKey::ActiveRecord_Associations_CollectionProxy:0x007fe20a86b480>
Later I plan on using an in-place editor gem but i would like to learn how this can be done fist.
EDIT:
Fixed the error ( changed form_for([@category, @keys]
to form_for([@category, key]
and turns out this way works for displaying and allowing all categories to be edited... to an extent.
I get another error when i submit a form
undefined method 'update_attribute'
EDIT 2
slowly getting there. I Changed the update @key variable to @key = @category.category_item_keys.all
to fix the error. But this line is now giving me problems
if @key = @category.category_item_keys.update_attributes(key_params)
'
THIRD EDIT
ERROR
Couldn't find CategoryItemKey without an ID
on line
@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"}
Here's how to clean up the code:
#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 %>
If you wanted to use an in-place
editor gem, I'd recommend looking at X-Editable
, as we've applied it here (its only a demo app, just sign up for free and go to profile):
这篇关于编辑页面以显示所有类别名称,每个类别名称上都有编辑输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!