当我转到字符 Controller 时,请显示操作,所有正常的params [:id]都应按照REST的要求进行操作。

在显示 View 中,我渲染了局部 View 。在那部分内容中,我有一个指向vote_socionics动作的链接。此动作是在socionics_votes模块下定义的,该模块包含在字符 Controller 中。 (我通过这种方式进行设置,因为我还有其他 Controller 也包含此模块)。

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

1)为什么会发生这种情况(是因为它是一个“不同的” Controller ,即使它是一个模块也是如此?)

2)我该如何解决?我认为将其设为params [:id]会更优雅,而不是必须进行if-else处理这两个键。

character_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

将鼠标悬停在部分链接中的URL。

本地主机.... / characters / 4-cc / vote_socionics?vote_type = neti

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

最佳答案

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

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

这样,正确设置了id参数

关于ruby-on-rails - 为什么参数 “id”键从params [:id]变为params [:model_id]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24550398/

10-15 07:27