2012-05-19 231 views
2

在我的應用程序,我試圖讓管理員用戶可以編輯「後」的一個屬性更新屬性

樁模型是:

class PostsController < ApplicationController 

before_filter :admin_user, only: [:edit, :update] 

def edit 
    @post = Post.find(params[:id]) 
end 

def update 
    @post = Post.find(params[:id]) 
    if @post.update_attributes(params[:post][:some_attr]) 
    flash[:success] = "Post updated" 
    redirect_to posts_path 
    else 
    redirect_to root_path 
    end 
end 

編輯觀點:

<% provide(:title, "Edit post") %> 
    <h1>Update the post</h1> 

    <div class="row"> 
    <div class="span6 offset3"> 
    <%= form_for(@post) do |f| %> 
     <%= f.label :some_attr %> 
     <%= f.text_field :some_attr %> 

    <%= f.submit "Save changes", class: "btn btn-large btn-primary" %> 
    <% end %> 

當我嘗試在編輯頁面some_attr test_field輸入 「123」,它呈現的錯誤:

NoMethodError in PostsController#update 

undefined method `stringify_keys' for "123":String 


Application Trace | Framework Trace | Full Trace 
app/controllers/posts_controller.rb:22:in `update' 
Request 

Parameters: 

{"utf8"=>"✓", 
"_method"=>"put", 
"authenticity_token"=>"EdTg+cFBnZY447oSDqSTPfb/PJ6VisJOrQ8kvichDrE=", 
"post"=>{"some_attr"=>"123"}, 
"commit"=>"Save changes", 
"id"=>"17"} 

可能是什麼問題?我錯過了哪一塊拼圖?

感謝

回答

1

的問題是這一行:

if @post.update_attributes(params[:post][:some_attr]) 

params[:post][:some_attr]只是一個值。未指定字段。如果將行更改爲

if @post.update_attributes(params[:post]) 

該屬性應按預期進行更新。

+0

謝謝!這解決了我的問題!其實update_attributes期待一個散列而不是一個字符串 – alexZ

+1

是的,正好。您可以傳入屬性的整個散列來更新。 [Here](http://apidock.com/rails/v3.2.3/ActiveRecord/Persistence/update_attributes)是關於'update_attributes'的一些文檔,如果你好奇的話。 – x1a4

2

我相信這行:

@post.update_attributes(params[:post][:some_attr]) 

應該這樣寫:

@post.update_attributes(params[:post]) 

要進行更新@post,你需要在屬性的整個散列通對於它 - 不只是你正在改變的那個。

祝你好運!

+0

謝謝!這是正確的..我應該做更多的研究之前問 – alexZ

+0

偉大 - 高興幫助! –