为什么params“id”键从params [:id]变为params [:model_id]?

时间:2014-07-03 09:49:56

标签: ruby-on-rails

当我去角色控制器,显示动作时,所有正常的参数[:id]都是按照REST的方式进行的。

在节目视图中,我渲染了一个部分。在那部分内容中,我有一个链接转到vote_socionics动作。此操作在socionics_votes模块下定义,该模块由字符控制器包含。 (我设置这种方式是因为我有其他控制器,也包括这个模块)。

我的问题是,当我点击此链接时,它会转到set_votable文件中的socionics_votes_module.rb私有方法,params[:id]不再存在。使用pry,我发现它实际上变成了params[:character_id]

问题:

1)为什么会发生这种情况(是因为它会转到"不同的"控制器,即使它是一个模块?)

2)我该如何解决这个问题?我认为将它设为params [:id]会更优雅,而不必为if-else设置两个密钥。

characters_controller.rb

class CharactersController < ApplicationController
  include SocionicsVotesModule

  def show
    @character = Character.find(params[:id])
  end

字符/ show.html.haml

= render partial: 'votes/vote_socionics', 
  locals: { votable: @votable, votable_name: @votable_name, socionics: @socionics }

_vote_socionics.html.haml

= link_to content_tag(:div,"a"), send("#{votable_name}_vote_socionics_path", votable, vote_type: "#{s.type_two_im_raw}"), 
          id: "vote-#{s.type_two_im_raw}", 
          class: "#{current_user.voted_on?(votable) ? 'voted' : 'not-voted'}",
          method: :post, 
          data: { id: "#{s.type_two_im_raw}" } 

socionics_votes_module.rb

module SocionicsVotesController
  extend ActiveSupport::Concern

  included do
    before_action :set_votable
  end

  private
    def set_votable
      votable_constant = controller_name.singularize.camelize.constantize
      @votable = votable_constant.find(params[:id])    # This is where it fails, since there is no params[:id], and rather, params[:character_id]
    end

    def set_votable_name
      @votable_name = controller_name.singularize.downcase
    end

的routes.rb

concern :socionics_votes do
  post 'vote_socionics'
end

resources :characters, concerns: :socionics_votes
resources :celebrities, concerns: :socionics_votes
resources :users, concerns: :socionics_votes

悬停时部分链接的网址。

...本地主机/字符/ 4立方厘米/ vote_socionics?vote_type =洗鼻

.find(params[:id] || params[:"#{@votable_name}_id"])之类的东西不起作用,而且看起来很傻。

1 个答案:

答案 0 :(得分:5)

您需要将vote_socionics路由添加为资源的成员:

concern :socionics_votes do
  member do
    post 'vote_socionics'
  end 
end

这样id参数设置正确