Schienen - Übergabe von Parametern in link_to

73

Die Indexseite "Meine Konten" listet alle Konten auf und enthält pro Konto einen Link zu "+ Service". Dies sollte den Benutzer auf die Seite / my_services / new leiten und das Feld account_id mit der entsprechenden ID vorab ausfüllen, je nachdem, auf welchen Link auf der Indexseite Accounts geklickt wurde.

Ich habe Debug (params) am Ende jeder Seite und mit dem, was ich versuche, bekomme ich nichts anderes als: controller und: action, die in meinen Parametern für die Seite / my_services / new angezeigt werden.

Der Link, den ich versucht habe, ist folgender:

link_to "+ Service", "my_services/new", :account_id => acct.id

Ich habe dann auch Logik im Services Controller:

def new
  @my_service = MyService.new
  if params[:account_id]
    @my_service.account_id = params[:account_id]
  end
end

Kann jemand dabei helfen? Ich habe es noch nicht geschafft, es mit ein paar fiesen kleinen hackigen Dingen in Gang zu bringen, die ich ausprobiert habe.

BEARBEITEN

Es stellt sich heraus, dass verschachtelte Ressourcen (möglicherweise mit der shallow: trueOption in route.rb) der richtige Weg sind, wenn sich jemand diese Antwort in Zukunft ansieht. Meine route.rb für diesen Teil sieht jetzt so aus:

resources :accounts, shallow: true do
  resources :services
end

Meine Links sehen jetzt so aus:

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>
bdx
quelle

Antworten:

108

Erstens ist link_to ein HTML-Tag-Helfer, sein zweites Argument ist die URL, gefolgt von html_options. Sie möchten account_id als URL-Parameter an den Pfad übergeben. Wenn Sie benannte Routen in route.rb korrekt eingerichtet haben, können Sie Pfadhelfer verwenden.

link_to "+ Service", new_my_service_path(:account_id => acct.id)

Ich denke, die beste Vorgehensweise besteht darin, Modellwerte als Parameter zu übergeben, die in folgenden Elementen verschachtelt sind:

link_to "+ Service", new_my_service_path(:my_service => { :account_id => acct.id })

# my_services_controller.rb
def new
  @my_service = MyService.new(params[:my_service])
end

Und Sie müssen steuern, dass account_id für die Massenzuweisung zulässig ist. In Rails 3 können Sie leistungsstarke Steuerelemente verwenden, um gültige Parameter innerhalb des Controllers zu filtern, zu dem sie gehören. Ich empfehle sehr.

http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods

Beachten Sie auch, dass, wenn account_id vom Benutzer nicht frei festgelegt wird (z. B. ein Benutzer nur einen Dienst für die eigene einzelne account_id senden kann), es besser ist, ihn nicht über die Anforderung zu senden, sondern ihn innerhalb des Controllers durch Hinzufügen von etwas festzulegen mögen:

@my_service.account_id = current_user.account_id 

Sie können die beiden sicherlich kombinieren, wenn Sie Benutzern nur erlauben, einen Dienst in ihrem eigenen Konto zu erstellen, dem Administrator jedoch erlauben, einen beliebigen Dienst mithilfe der Rollen in attr_accessible zu erstellen.

hoffe das hilft

Viktor Trón
quelle
Ich frage mich, ob dies funktionieren wird. link_to "Service", "my_services / new? account_id =" + acct.id
Zia Ul Rehman Mughal
2
link_to "+ Service", controller_action_path(:account_id => acct.id)

Wenn es immer noch nicht funktioniert, überprüfen Sie den Pfad:

$ rake routes
Vish
quelle