Rails接受JSON作为输入的动作,将JSON转换为Object然后保存

时间:2013-10-28 02:20:25

标签: ruby-on-rails

我有一个像这样的简单新表格:

<h1> New </h1>

<%= form_for :user, url: 'create' do |f| %>

    <p>
    <%= f.label :firstName %>   
    <%= f.text_field :firstName %>
    </p>

    <p>
    <%= f.label :lastName %>    
    <%= f.text_field :lastName %>
    </p>

    <p>
    <%= f.label :userName %>    
    <%= f.text_field :userName %>
    </p>

    <p>
    <%= f.label :password %>    
    <%= f.text_field :password %>
    </p>

    <p>
    <%= f.label :email %>   
    <%= f.text_field :email %>
    </p>

    <p>
        <%= f.submit %>
    </p>

<% end %>

如您所见,它会调用以下定义的创建操作:

def create  
    @user = User.new(params[:user])
    @user.save
  end 

它给了我以下错误:

ActiveModel::ForbiddenAttributesError

Extracted source (around line #8):
6
7
8
9
10
11

  def create 

    @user = User.new(params[:user])
    @user.save

  end 

我想要的是我的方法创建接受输入作为json参数,然后将这些参数转换为用户对象,然后保存对象。

更新:

我有以下创建方法,定义为post:

def create  
  @user = User.new(user_params)   
  @user.save  
  end 

我发送以下json但它永远不会被保存:

{"firstName":"John", "lastName:"Doe", "userName":"johndoe", "password":"mypassword", "email":"johndoe@gmail.com"}

更新:

传递以下JSON后:

{"user":{"firstName":"John", "lastName:"Doe", "userName":"johndoe", "password":"mypassword", "email":"johndoe@gmail.com"}}

我在HTTPClient应用程序中收到以下错误:

<h2>795: unexpected token at &#39;{&quot;user&quot;:{&quot;firstName&quot;:&quot;John&quot;, &quot;lastName:&quot;Doe&quot;, &quot;userName&quot;:&quot;johndoe&quot;, &quot;password&quot;:&quot;mypassword&quot;, &quot;email&quot;:&quot;johndoe@gmail.com&quot;}}&#39;</h2>

更新:

现在我收到JSON后出现以下错误:

的ActionController :: InvalidAuthenticityToken       在UsersController #create

1 个答案:

答案 0 :(得分:1)

您遇到的错误来自Strong Parameters,Rails默认包含在Rails中。尝试在控制器中使用以下代码,而只允许某些参数:

def create
  @user = User.new(user_params)
  @user.save

  respond_to do |format|
    format.json { render :json => @user }
  end
end

private

  def user_params
    params.require(:user).permit(:firstName, :lastName, :userName, :password, :email)
  end