编辑页面以显示每个

时间:2016-01-12 05:26:49

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

我将类别嵌套在指南中。我正在构建一个应用程序来更好地学习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"}

3 个答案:

答案 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(它只是一个演示应用,只需免费注册并转到个人资料):

enter image description here

答案 2 :(得分:0)

使用rails 4中提供的nested forms