2016-07-01 9 views
1

Ich versuche, Benutzer zu ermöglichen, Einstellungen von Standardeinstellungen mit einem Formular für ledermann-rails-settings zu aktualisieren. Ich habe das Formular basierend auf this answer erstellt, aber wenn ich versuche, das Formular zu senden, um Einstellungen zu aktualisieren, erhalte ich einen Routingfehler, der mit verschachtelten Ressourcen zu tun hat, aber ich bin neu in RoR, also bin ich mir nicht sicher. Andere Fragen dazu auf SO scheinen Rails 3 oder eine vorherige Version des Edelsteins zu verwenden. Ich benutze Schienen 4.2.1.Routing-Fehler für verschachtelte Ressource mit Ledermann-Rails-Einstellungen

routes.rb:

resources :users do 
    resources :settings 
end 

Rake Routen:

 user_settings GET /users/:user_id/settings(.:format)   settings#index 
        POST /users/:user_id/settings(.:format)   settings#create 
    new_user_setting GET /users/:user_id/settings/new(.:format)  settings#new 
    edit_user_setting GET /users/:user_id/settings/:id/edit(.:format) settings#edit 
     user_setting GET /users/:user_id/settings/:id(.:format)  settings#show 
        PATCH /users/:user_id/settings/:id(.:format)  settings#update 
        PUT /users/:user_id/settings/:id(.:format)  settings#update 
        DELETE /users/:user_id/settings/:id(.:format)  settings#destroy 
       users GET /users(.:format)       users#index 
        POST /users(.:format)       users#create 
      new_user GET /users/new(.:format)      users#new 
      edit_user GET /users/:id/edit(.:format)     users#edit 
       user GET /users/:id(.:format)      users#show 
        PATCH /users/:id(.:format)      users#update 
        PUT /users/:id(.:format)      users#update 
        DELETE /users/:id(.:format)      users#destroy 

die Form:

<%= form_for(:settings) do |form| %> 
<h3>Dashboard settings</h3> 
    <%= form.fields_for :dashboard, current_user.settings(:dashboard) do |f| %> 
     <%= f.label :theme_light, 'Light (Default)' %> 
     <%= f.radio_button :theme, "themes/flatly" %> 
     <%= f.label :theme_dark, 'Dark' %> 
     <%= f.radio_button :theme, "themes/darkly" %> 
    <% end %> 
    <%= form.submit "Save" %> 
<% end %> 

SettingsController:

class SettingsController < ApplicationController 
    def update 
    if params[:settings] 
     params[:settings].each do |key, value| 
     current_user.settings(key.to_sym).update_attributes! value 
     end 
     flash[:success] = "Settings updated!" 
     redirect_to root_path 
    else 
     render 'edit' 
    end 
    end 
end 

User.rb:

has_settings do |s| 
    s.key :dashboard, :defaults => { :theme => 'themes/flatly' } 
end 

Absenden des Formulars jetzt als Service-Leistung gibt die folgende Routing-Fehler:

Started POST "https://stackoverflow.com/users/1/settings/1/edit" for 72.231.138.82 at 2016-07-01 15:12:36 +0000 ActionController::RoutingError (No route matches [POST] "https://stackoverflow.com/users/1/settings/1/edit")

Ich glaube, ich die Rails Guides verstehen für verschachtelte Ressource bildet, dass die erste bedeuten Zeile der Form sollte so etwas wie

<%= form_for([@user, @settings]) do |form| %> 

aber geändert wird, gibt den Fehler

sein

Außerdem scheint ledermann-rails-settings keine Methode zu haben, alle Einstellungen aufzurufen (zumindest soweit ich das bei der aktuellen Version des Gems sehen kann), also bin ich mir nicht sicher wie Ich würde sogar @settings definieren.

Ich habe versucht, verschiedene Pfade in das Formular ohne Glück, sowie versuchen Ressource: Einstellung und Ressourcen: Einstellungen in routes.rb. Ich habe das Gefühl, dass ich etwas auf der Controller- oder Routenebene verpasse, aber ich habe nicht genug Erfahrung, um zu wissen, wo und auf welchen Formularen die Edelsteindokumente und -probleme nicht viel zu finden sind.

Antwort

1

Falls es jemand anderem hilft, hier ist, wie ich das funktionierte.

<%= form_for(:settings, url: user_setting_path, html: { method: :put }) do |form| %> 

SettingsController

def update 
    if setting_params 
    setting_params.each do |key, value| 
     @current_user.settings(key.to_sym).update_attributes! value 
    end 
    flash[:success] = "Settings updated!" 
    redirect_to request.referrer 
    else 
    render 'edit' 
    end 
end 

def setting_params 
    params.require(:settings).permit(dashboard: :theme) 
end 
+0

mir viel geholfen. Vielen Dank! –