2016-06-17 6 views
0

My ModelRails ActiveRecord Wie fügt man ein zusätzliches Feld zu params.fetch (modelName) hinzu?

class User < ActiveRecord::Base 
end 

mein Controller

class UsersController < ApplicationController 
    ... 
end 

Wenn ich zusätzlich Feldpost Aktion schreiben wie { "xx": 7 ...} {"user_email"=>"[email protected]", "user_pw"=>"123456", "xx"=>7, "controller"=>"users", "action"=>"create", "user"=>{"user_pw"=>"123456", "user_email"=>"[email protected]"}}

kann ich nicht gefunden das Attribut "xx => 7" im Attribut "user". Wie kann ich es nach param ["user"] ["xx"] verschieben.

Hier ist mein Code

wegen „xx“ ist nicht UserModel so Attribute, ich denke, dass Usercontroller Felder UserModel unter Verwendung aller Parameter automatisch zu filtern, wenn die controller mit Modellname mit dem gleichen Namensregel zugeordnet ist. Also fehlt mir im Benutzerknoten "xx".

class User < ActiveRecord::Base 
    # include fields: uid, user_name, user_mobile. 
end 

class UsersController < ApplicationController 
    def user_params 
    params.fetch(:user).extract!(:uid).permit! 
    end 

    def create 
    user = User.new(user_params) 
    user.save! 
    render :nothing => true, :status => 202 
    end 
end 

Ich kann einen Trick gesetzt wrap_parameter in Reglereinstellung

wrap_parameters :user, include: User.column_names << 'xx' 

oder

wrap_parameters true 
# but user node will be "true" => {"xxx": "test", "user_name": ... }, acception all field even if it's not UserModel attributes. 

Schließlich möchte ich, dass die 'Nutzer' wrap_parameters ohne Setup alle Spalten enthalten, die Client senden Server. Ich möchte nicht wie include einrichten: [* column_names].

Antwort

0

In Ihrer form Teil/Ansicht müssen Sie das versteckte Attribut oder wie Sie den xx Wert in das Formular setzen.

<%= form_for @user, do |f| %> 
    ...... 
    <%= f.hidden_field :xx, value: "7" %> 
<% end %> 

diese Weise ist es unter "user" sein wird.

+0

Ich fand, dass Wenn die Eigenschaft von JSON Anfrage Körper ist eines der Modell-Feld, wird es automatisch zum Benutzer Knoten bewegen. Ich möchte ein einzelnes Feld hinzufügen und es in Benutzerknoten bewegen, aber ich möchte Format wie {"Benutzer": {"xx": "123"}} – scott1028

+0

@ scott1028 Können Sie Ihren Formular- und Controller-Code teilen? Dies sollte nicht der Fall sein, da Sie Params wie "id" => 1, "user" => {"id" => 2} 'haben könnten, wobei ein 'id' den 'user' Datensatz darstellt, aber der andere vollständig etwas anderes und es würde einen Konflikt verursachen. – Kkulikovskis

1

Es sieht so aus, als würden Sie sich derzeit auf parameter wrapping verlassen, insbesondere lassen Sie es in seinem automatischesten Modus arbeiten. Wenn in diesem Szenario ein Parameter namens foo an UsersController gesendet wird und das Modell User ein Feld mit diesem Namen enthält, kopiert rails es in params[:user].

Sie können dieses Verhalten auf zwei Arten ändern: Sie könnten attribute_names in Ihrem Modell neu definieren, um diese zusätzliche Spalte zurückzugeben. Ich bin mir nicht sicher, was diese Methode sonst noch benutzt - könnte an anderer Stelle unbeabsichtigte Konsequenzen haben.

Je weniger störende Veränderung zu setzen wäre

wrap_parameters User, include: [:user_pw, :user_email, :xx] 

An der Spitze des Controllers, um explizit Regler zu sagen, welche params sollten auf diese Weise behandelt werden.

Verwandte Themen