2012-12-20 92 views
1

我試過User.create(params),但是這說「控制器」和「動作」不是可以分配的。我可以排除這些屬性,但有沒有更簡單的方法來組合我需要的屬性?從控制器參數保存Rails模型?

一些示例似乎表明我可以使用params [:user],但是如果我希望帖子只是用戶對象,則params [:user]看起來像是nil。

所以我發佈{username:'blah',密碼:'blah'},並且用戶名和密碼在params中,但不是params [:user]。

class UsersController < ApplicationController 
    def create 
    user = User.create(params[:user]) 
    if user.save 
     render :json => user, :status => :created 
    else 
     logger.error user.errors 
     render :json => {:status => :error, :errors => user.errors}, :status => :bad_request 
    end 
    end 
end 
+0

http://stackoverflow.com/questions/7376659/make-attributes-mass-assignable-only-during-creation – MrYoshiji

+0

這甚至不是同一個問題。 –

+0

如果你做了一個'params'的簡單輸出,你會發現它有不同的參數,比如'controller'和'action'。 'User.create(params)'將嘗試創建一個用戶併爲其分配params屬性。由於你的params有非屬性值(action,controller,commit,utf等),它不會工作,並引發Mass Assignment錯誤。 – MrYoshiji

回答

1

嘗試User.create(request.request_parameters)User.create(JSON.parse(request.body.read))

+0

request.request_parameters工作。 –

2

有一個在Rails的項目約定,其中表單元素都以某種方式命名(使用表單助手自動爲您完成此):

<input type='text' name='user[username]'> 
<input type='text' name='user[username]'> 

當他們發佈到控制器,這些都是轉換爲params哈希表:

params = { 
    :user => { 
    :username => 'whatever', 
    :password => 'somepass' 
    } 
} 

的由於路由的工作方式,爲控制器,動作ID鍵 - 值對(如果適用的話)或任何自定義路由份加入到該PARAMS散列。

params.merge!({ 
    :controller => 'users', 
    :action  => 'create' 
}) 

如果params[:user]對您無效,您可能需要更改表格以符合約定。