2016-03-02 46 views
0

我有以下rails应用程序,它允许用户订阅小部件。即通过订阅通过用户到小部件的模型进行多对多。param丢失或值为空:user - Rails

我的模型:

class Subscription < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :widget 
    validates_uniqueness_of :user_id, scope: :widget_id 
end 

class User < ActiveRecord::Base 
    has_many :subscriptions 
    has_many :widgets, through: :subscriptions 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 

class Widget < ActiveRecord::Base 
    has_many :subscriptions 
    has_many :users, through: :subscriptions 
end 

我的控制器:

class SubscriptionsController 
    def edit 
    @user = current_user 
    end 

    def update 
    @user = current_user 
    if @user.update(user_subscription_params) 
     redirect_to @user, notice: "Subscriptions updated" 
    else 
     render :edit 
    end 
    end 

    private 

    def user_subscription_params 
    params.require(:user).permit(:widget_ids) 
    end 
end 

,这在views/subscriptions/_forms.html.erb正在呈现:

<%= form_for @user, url: user_subscription_path, method: :patch do |f| %> 
    <%= f.collection_check_boxes :widget_ids, Widget.all, :id, :name %> 
    <%= f.submit %> 
<% end %> 

我收到错误:

No route matches {:action=>"show", :controller=>"subscriptions"} missing required keys: [:id]

我会很感激任何想法如何解决这个问题。

编辑:

的routes.rb:

Rails.application.routes.draw do 
    root 'home#index' 

    resources :widgets 
    resources :subscriptions 
    devise_for :users 

    devise_scope :user do 
    get '/users/sign_out' => 'devise/sessions#destroy'  
    end 

authenticated :user do 
    root to: 'home#index', as: :authenticated_root 
end 
+0

你可以发表你的routes文件 – chaitanya

+0

@chaitanya当然,请参阅问题更新 –

+0

也是方法:把它用来代替:patch – chaitanya

回答

0

您可以尝试

<%= form_for @user, url: user_subscription_path(@user), method: :patch do |f| %> 
    <%= f.collection_check_boxes :widget_ids, Widget.all, :id, :name %> 
    <%= f.submit %> 
<% end %> 
相关问题