为has_many创建动作:通过

时间:2014-03-12 05:37:17

标签: ruby-on-rails has-many-through

我有这样的模特:

User
Paper
Subscription

如您所见,has_many :through商店与Subscription商店有:user_id and :paper_id

Paper有自己的控制器,其PapersController#index操作列出了所有可用的文件。

现在真正的问题

我想添加"订阅"链接到每篇论文旁边,这意味着要调用

SubscriptionsController#create

方法

在我的PapersController#index

<td><%= link_to "Subscribe", subscriptions_path(paper),:method => :post %></td>

在我的SubscriptionsController #create中我有

    def create
        @subscription = current_user.subscriptions.build(subscription_params)
        if @subscription.save
          flash[:success] = "Paper Added to Profile"
          redirect_to root_url
        else
          render 'static_pages/home'
        end  
   end

当我查看订阅表时:paper_id是nil,我怎么能得到:paper_id 我做错了什么?

3 个答案:

答案 0 :(得分:1)

link_to "Subscribe", subscriptions_path,:method => :post的等效路线是

POST   /subscriptions(.:format)                              subscriptions#create

因此,您必须明确传递paper_id。看看link_to

更新您的<td><%= link_to "Subscribe", subscriptions_path(paper_id: paper.id),:method => :post %></td>

链接

而不是

@subscription = current_user.subscriptions.build(subscription_params)

它应该是(因为paper_id不在订阅命名空间之下,你可以直接访问它)

@subscription = current_user.subscriptions.build({paper_id: params[:paper_id]})

答案 1 :(得分:0)

请试试以下内容。

def create
        paper = Paper.where(id: params[:id]).first
        @subscription = current_user.subscriptions.push(paper)
        flash[:success] = "Paper Added to Profile"
        redirect_to root_url
   end

答案 2 :(得分:0)

从服务器控制台或调试中重新检查params值。我认为您可能将纸张作为单独的参数提供,例如params [:paper_id],但您只能通过subscription_params构建@subscription实例,而不是paper_id的值。为此,请修改您的创建操作,如此

@subscription = current_user.subscriptions.build(subscription_params.marge({:paper_id => params[:paper_id]})