Rails - ชื่อการกระทำของตัวควบคุมไปยังสตริง


160

ฉันมีคำถาม Rails

ฉันจะได้รับชื่อการกระทำของตัวควบคุมภายในการดำเนินการควบคุมได้อย่างไร

ตัวอย่างเช่นแทนที่จะเป็น

def create
  logger.info("create")
end

ฉันต้องการเขียนบางอย่างเช่น

def create
  logger.info(this_def_name)
end

วิธีการได้รับthis_def_nameคืออะไร?

คำตอบ:


337

ทางรถไฟ 2.X :@controller.action_name

ราง 3.1.X : controller.action_name,action_name

Rails 4.X :action_name


5
หรือ 'controller.action_name' ใน Rails 3.0 นี่เป็นวิธีที่ดีที่สุดในการเข้าถึงชื่อการกระทำในมุมมอง
emk

2
หากคุณต้องการที่จะใช้ในกับบล็อกทำ before_filter stackoverflow.com/questions/2669663/…before_filter { |controller| ... }
Benjamin Oakes

3
FYI action_nameทำงานใน Rails 3.2.13 และcontroller.action_nameไม่
Zach

Rails 2.3.XX และ @ controller.action_name ไม่ทำงานคุณต้องใช้เพียง action_name สำหรับเวอร์ชันนี้
mkralla11

มีรุ่นสัญลักษณ์หรือไม่?
Bogdan Gusiev

34

ในกรณีที่เฉพาะเจาะจงของการดำเนินการ Rails (ตรงข้ามกับกรณีทั่วไปของการรับชื่อวิธีปัจจุบัน) คุณสามารถใช้ params[:action]

หรือคุณอาจต้องการปรับแต่งรูปแบบบันทึกของ Rails เพื่อให้ชื่อการกระทำ / วิธีการนั้นรวมอยู่ในรูปแบบมากกว่าที่จะอยู่ในข้อความบันทึกของคุณ


8
คุณเคยได้รับการกระทำปัจจุบันโดยการเรียก action_name ฉันไม่แน่ใจว่ามันยังใช้งานได้ แต่ฉันคิดเสมอว่ามันดีกว่าการสอบถาม params
jonnii

เพื่อชี้แจงให้ชัดเจนว่าเป็น "controller.action_name" หรือ "params [: action]" ดังนั้นคุณอาจทำ <% ถ้า controller.action_name == 'new'%> ในมุมมอง มันใช้งานได้สำหรับฉันใน Rails 3.2
dmonopoly

1
นอกจากนี้คุณยังสามารถรับชื่อคอนโทรลเลอร์ผ่าน params [: controller]
Ash Blue

action_name == 'new'(ไม่ได้แก้ไข) ยังคงใช้ได้กับฉันใน Rails 3.2
Brendon Muir

17

ชื่อคอนโทรลเลอร์:

<%= controller.controller_name %>

return => 'ผู้ใช้'

ชื่อการกระทำ:

<%= controller.action_name %>

return => 'แสดง'

ID:

<%= ActionController::Routing::Routes.recognize_path(request.url)[:id] %>

return => '23'


7

ตัวอย่างนี้ใช้ได้กับ Rails 3

class ReportsController < ApplicationController

  def summary
    logger.debug self.class.to_s + "." + self.action_name
  end

end

จะพิมพ์

. . . ReportsController.summary

. .


3

คำตอบของ mikej นั้นแม่นยำและเป็นประโยชน์มาก แต่สิ่งที่ฉันอยากรู้ก็คือวิธีรับชื่อวิธีปัจจุบันในราง

พบว่าเป็นไปได้ด้วย self.current_method

พบได้ง่ายที่http://www.ruby-forum.com/topic/75258


-4

ฉันแค่ทำแบบเดียวกัน ฉันทำมันในคอนโทรลเลอร์ผู้ช่วยรหัสของฉันคือ:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

วิธีการเหล่านี้จะส่งคืนผู้ควบคุมและชื่อการกระทำปัจจุบัน หวังว่ามันจะช่วย


39
ทำให้เกิดความสับสน ห่อทำไมcontroller_nameซึ่งเป็นวิธีการที่ผลตอบแทนที่ชื่อของตัวควบคุมในปัจจุบันในวิธีอื่นที่เพิ่งโทร controller_name ? ทำไมไม่เพียงแค่โทรcontroller_nameและทำได้ด้วยล่ะ
piersadrian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.