【问题标题】:routing error for nested resource with ledermann-rails-settings具有 ledermann-rails-settings 的嵌套资源的路由错误
【发布时间】:2016-07-01 15:22:58
【问题描述】:

我正在尝试允许用户使用ledermann-rails-settings 的表单从默认设置更新首选项。我得到了基于this answer 构建的表单,但是当我尝试提交表单以更新设置时,我收到一个我认为与嵌套资源有关的路由错误,但我是 RoR 的新手,所以我不确定. SO 上关于此的其他问题似乎使用 Rails 3 或以前版本的 gem。我正在使用 Rails 4.2.1。

routes.rb:

resources :users do
  resources :settings
end

耙路线:

      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

形式:

<%= 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 %>

设置控制器:

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

用户.rb:

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

现在按原样提交表单会出现以下路由错误:

在 2016 年 7 月 1 日 15:12:36 +0000 为 72.231.138.82 开始 POST "/users/1/settings/1/edit" ActionController::RoutingError (没有路由匹配 [POST] "/users/1/settings/1/edit")

我想我理解嵌套资源表单的 Rails 指南意味着表单的第一行应该类似于

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

但改变会导致错误

表单中的第一个参数不能包含 nil 或为空

此外,ledermann-rails-settings 似乎没有调用所有设置的方法(至少就我目前版本的 gem 而言),所以我不确定我会怎么做定义@settings。

我尝试在表单中指定不同的路径,但没有成功,还尝试了资源:设置和资源:routes.rb 中的设置。我觉得我在控制器或路由级别缺少一些东西,但我没有足够的经验知道在哪里,并且 gem 文档和问题在表单上没有太多内容。

【问题讨论】:

    标签: ruby-on-rails forms rubygems settings


    【解决方案1】:

    如果它对其他人有帮助,这就是我的工作方式。

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

    设置控制器

    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
    

    【讨论】:

    • 帮了我很多。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多