2016-08-21 5 views
0

Schienen ver. 5.0.0.1So übergeben Sie Parameter über link_to

Ich möchte eine neue Eigenschaft erstellen und zuweisen über link_to von einer Portfolio-SHOW-Seite. Der Link sollte portfolio_id als Parameter übergeben und speichern, nachdem das verbleibende Eigenschaftsformular ausgefüllt wurde.

Ich habe diese Frage mehrmals gefragt, aber aus irgendeinem Grund funktioniert die richtige Antwort in meiner eigenen App nicht funktioniert. Jede Hilfe wäre willkommen, danke!

# portfolio show.html.erb 

<%= link_to 'Add New Property To This Portfolio', new_property_path(:portfolio_id => @portfolio.id) %> 

# properties controller 

def new 
@portfolio = :portfolio 
@property = Property.new(params[:portfolio_id => @portfolio]) 
end 

# portfolio model 

has_many :properties 

# property model 

belongs_to :portfolio 
accepts_nested_attributes_for :portfolio 

Antwort

0

Sie übergeben die Parameter in Ordnung, aber Sie lesen sie nicht richtig. Ihr aktueller Code:

def new 
    @portfolio = :portfolio 
    @property = Property.new(params[:portfolio_id => @portfolio]) 
end 

sollte lauten:

def new 

    # Rails stores params passed through a link_to in the params 
    # hash, like any other parameter 

    @portfolio = params[:portfolio] 
    @property = Property.new(params[:portfolio_id => @portfolio]) 
end 

Es gibt einige andere Probleme mit Ihrem Code, die Sie vielleicht adressieren:

1) Sie haben ein Feld namens @portfolio, aber Es enthält eine ID. Normalerweise würde ein einfacher Name wie dieser eine Instanz eines Portfolio Objekts speichern. Wenn ein Feld id speichert, fügen Sie _id an das Ende an. Es hilft den Leuten zu verstehen, was in dem Feld ist, und gibt eine gute Vermutung über den Datentyp (wichtig für Skriptsprachen wie Ruby);

2) Sind Sie sicher, dass Sie Ihre link_to auf die new Methode gehen möchten? Was passiert, wenn jemand den anderen Pfad verwendet, um zu new zu gelangen (wie die URL im Browser eingeben), ohne portfolio_id zu setzen? Wird dein Code nicht kaputt gehen?

3) Sind Sie sicher, dass Sie ein Property Objekt mit nur portfolio_id erstellen können? Normalerweise würden Sie property_params an die neue Methode übergeben, um eine neue Property zu erstellen.

Diese Dinge sind alle Dinge, die Sie in verschiedenen Fragen behandeln sollten, sobald Sie für eine Weile über sie nachdenken, aber passierende Parameter über link_to sollten jetzt gelöst werden.

0

Ich denke, Sie müssen nested_attributes von property Modell innerhalb portfolio Modell akzeptieren. Dann können Sie auf der Showseite des Portfolios property für eine bestimmte portfolio unter Verwendung der link_to_add Methode hinzufügen.

Portfolio Modell

has_many :properties 
accepts_nested_attributes_for :properties, :allow_destroy => true,, reject_if: :all_blank 

Objektmodell

belongs_to :portfolio 

PortfoliosController.rb

##Build in new method: 

def new 
    @portfolio_object = Portfolio.new 
    @portfolio_object.properties.build 
end 

in privaten verschachtelte Attribute Methode Accept

private 

def portfolio_params  
    params.require(:portfolio).permit(:list_of_portfolio_parameters, properties_attributes: [ :list_of_properties_parameters, :_destroy ]) 
end 

bauen Dann property Attribute in Ihrem Portfolionew Methode der HTML-Seite. Hoffe es wird dir helfen.

Verwandte Themen