【问题标题】:Rails Action to Accept JSON as Input, Convert JSON to Object and Then SaveRails Action 接受 JSON 作为输入,将 JSON 转换为对象然后保存
【发布时间】:2013-11-06 17:20:10
【问题描述】:

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

<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 在用户控制器中#create

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您遇到的错误来自Strong Parameters,Rails 4 默认包含在 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
    

    【讨论】:

    • 谢谢我成功了!但是创建操作是否接受 json 参数。我想获取 json 参数,然后将其转换为用户对象,然后保存用户对象。
    • 表单将使用POST请求发送参数,因此它不使用json参数,但它可以创建一个新用户。您展示的表单是唯一期望从中获得新用户的地方,还是您需要为您的应用程序创建一个 API?
    • 我需要为我的应用程序创建一个 API,然后在我的 iOS 应用程序中使用它!谢谢你的帮助。使用 Rails 的第一天 :(
    • 您应该能够默认发送 JSON,而无需更改任何内容,只要您在请求中使用正确的标头即可。我已经更新了控制器代码,以便 rails 应用程序将响应用户的 JSON 编码表示,该表示刚刚保存在响应中。继续使用 Rails,它会变得更好,一旦习惯了它,使用它实际上会非常有趣!
    • 您使用什么来发送请求?您需要有适当的标题:{'ACCEPT' =&gt; "application/json", 'CONTENT_TYPE' =&gt; 'application/json'},以便 rails 知道您想要返回什么。我认为现在它假设您需要 html 作为响应,但您没有 html 模板。 Rails 很复杂,而且您也是从 Rails 中更复杂的部分开始的,所以我不会气馁。
    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 2023-03-05
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多