2016-04-19 38 views
1

Benutzer einen Beitrag erstellen und an einer seiner Sammlungen (post belongs_to Sammlung) zuweisenRails 4 params Validierung

Ich habe eine Arbeits Drop-Down, die von der aktuellen Gruppe objekt Benutzer lesen, würde ich jedoch Benutzer vermeiden möchten (Angreifer) übergeben falsche Parameter wie collection_id zu falschem Benutzer gehört.

Ich getestet mit einem text_field und zuweisen collection_id von falschen Benutzer und Post gespeichert, das ist, was ich verhindern möchte.

Wie kann ich das tun?

1) Innerhalb der Business-Schicht. (Ich denke, Validierung innerhalb Modell)

2) innerhalb des DB-Schicht (einige db Constraints)

3) bevorzugt, beide

Anmerkung: Ich muss vorfüllen Form mit einigen Variablen aus dem vorhergehenden Schritt, dann kann der Benutzer oder für den Fall, füllen ändern sie

post_controller.rb leer sind:

@post = current_user.posts.build(url: @url, content: @title) 

def post_params 
    params.require(:post).permit(:content, :url, :collection_id) 
end 

Modelle:

collection.rb: 
belongs_to :user 
has_many :posts 

user.rb: 
has_many :posts 
has_many :collections 

post.rb: 
belongs_to :user 
belongs_to :collection 

Routen:

post 'post' => 'posts#create' 

Form:

<%= form_for(@post, html: { multipart: true }) do |f| %> 
    <%= f.hidden_field :url %> 
    <%= f.text_field :content %> 
    <%#= f.text_field :collection_id %> # This to test passing incorrect values 
    <%= f.collection_select :collection_id, Collection.order(:id),:id,:title, include_blank: true %> 
    <%= f.submit "Post", class: "btn btn-primary" %> 
<% end %> 

Die Werte aus der Form gehen post_controller # erstellen

+0

Wo ist 'post_params' und genauer gesagt das Ergebnis, dass Ihr' collection_select' in Ihrem Controller verwendet wird? –

+0

das Ergebnis von Ihrer Sammlung_select gehen Sie zu post_controller # erstellen –

Antwort

0

Unter der Annahme, dass Sie den Verein gegründet haben zwischen ein Benutzer und seine/ihre Sammlungen, vielleicht können Sie versuchen:

unless current_user.collections.find(params[:post][:collection_id]).blank? 
    @post = current_user.posts.build(url: @url, content: @title) 
end 

Es wird überprüft, ob die Sammlung dem Benutzer gehört. Falls eine solche Sammlung nicht existiert, gibt sie null zurück.

Eine andere Sache, die Sie versuchen können, wenn die Sammlung mit dem Benutzer zugeordnet ist,:

current_user.collections.find(params[:post][:collection_id]).posts.build(url: @url, content: @title) 

Ich bin nicht ganz sicher, ob dies die effizientesten Wege selbst sind, aber ich denke, sie sollte die Arbeit tun, die Du willst fertig werden.

0

Ja, können Sie durch Prüfen falsche Datensatz Speicher vermeiden, wenn collection_id an Benutzern gehören oder nicht, indem Sie wie:

unless current_user.collection_ids.include?(params[:post][:collection_id]).blank? 
    @post = current_user.posts.build(post_params) 
end 

Aber ich denke, Sie mit benutzerspezifische Sammlung IDs aus wie wählen beschränken soll:

<%= f.collection_select :collection_id, current_user.collections.order(:id),:id,:title, include_blank: true %>