Rails - Cách sử dụng Trình trợ giúp bên trong Bộ điều khiển


207

trong khi tôi nhận ra rằng bạn phải sử dụng một trình trợ giúp trong chế độ xem, tôi cần một trình trợ giúp trong trình điều khiển của mình khi tôi đang xây dựng một đối tượng JSON để trả về.

Nó đi một chút như thế này:

def xxxxx

   @comments = Array.new

   @c_comments.each do |comment|
   @comments << {
     :id => comment.id,
     :content => html_format(comment.content)
   }
   end

   render :json => @comments
end

Làm thế nào tôi có thể truy cập html_formatngười trợ giúp của tôi ?


2
bạn có thể muốn xem xét câu trả lời của @ Grosser, nó hoàn chỉnh hơn nhiều.
tokland

Tôi biết điều này đã cũ nhưng ... có gì sai với các lớp ruby ​​đơn giản? : p
Tarek

Câu trả lời:


205

Lưu ý: Điều này đã được viết và chấp nhận trở lại trong Rails 2 ngày; ngày nay câu trả lời của Grosser là con đường để đi.

Tùy chọn 1: Có lẽ cách đơn giản nhất là đưa mô-đun trợ giúp vào bộ điều khiển của bạn:

class MyController < ApplicationController
  include MyHelper

  def xxxx
    @comments = []
    Comment.find_each do |comment|
      @comments << {:id => comment.id, :html => html_format(comment.content)}
    end
  end
end

Tùy chọn 2: Hoặc bạn có thể khai báo phương thức của trình trợ giúp là một hàm lớp và sử dụng nó như sau:

MyHelper.html_format(comment.content)

Nếu bạn muốn có thể sử dụng nó làm cả hàm cá thể và hàm lớp, bạn có thể khai báo cả hai phiên bản trong trình trợ giúp của mình:

module MyHelper
  def self.html_format(str)
    process(str)
  end

  def html_format(str)
    MyHelper.html_format(str)
  end
end

Hi vọng điêu nay co ich!


Cảm ơn nhưng tôi hơi bối rối. Ngay bây giờ người trợ giúp của tôi đang ở /app/helpers/application_helper.rb ... Bạn có đề nghị tôi nên chuyển trình trợ giúp sang ApplicationContoder không?
AnApprentice

Tôi đã thêm 'bao gồm ApplicationHelper' vào application_controll của mình nhưng lỗi đó với 'NoMethodError (phương thức không xác định `html_format' cho ApplicationHelper: Module): '
AnApprentice 26/211

1
@AnApprentice Có vẻ như bạn đã tìm ra nó, nhưng tôi đã điều chỉnh câu trả lời của mình một chút, hy vọng làm cho mọi thứ rõ ràng hơn. Trong phiên bản đầu tiên, bạn chỉ có thể sử dụng html_format- bạn chỉ cần MyHelper.html_formattrong lần thứ hai.
Xavier Holt

4
Điều này không hoạt động khi phương thức trợ giúp bạn muốn sử dụng sử dụng các phương thức xem như link_to. Kiểm soát viên không có quyền truy cập vào các phương pháp này và hầu hết những người trợ giúp của tôi sử dụng các phương pháp này. Ngoài ra, bao gồm cả trình trợ giúp vào bộ điều khiển sẽ hiển thị tất cả các phương thức của trình trợ giúp là các hành động có thể truy cập công khai không tốt. view_contextlà cách để đi trong Rails 3.
GregT

@GregT - Chưa từng thấy câu trả lời của Gross trước đó, vì nó xuất hiện một chút sau thực tế, nhưng tôi cũng thích nó hơn. Anh ấy chỉ nhận được upvote của tôi.
Xavier Holt

303

Bạn có thể dùng

  • helpers.<helper>trong Rails 5+ (hoặc ActionController::Base.helpers.<helper>)
  • view_context.<helper>( Rails 4 & 3 ) (CẢNH BÁO: điều này khởi tạo một thể hiện chế độ xem mới cho mỗi cuộc gọi)
  • @template.<helper>(Đường ray 2 )
  • bao gồm người trợ giúp trong một lớp đơn và sau đó singleton.helper
  • include trình trợ giúp trong bộ điều khiển (CẢNH BÁO: sẽ biến tất cả các phương thức của trình trợ giúp thành các hành động của bộ điều khiển)

56
Câu trả lời này thậm chí còn tốt hơn! Trong rails 3, gọi view_context.helper_functionđơn giản là đơn giản và hoạt động tuyệt vời. ActionController::Base.helpers.helper_functioncũng tốt không kém
trisweb

29
view_context= thiên tài
n_i_c_k

5
CẢNH BÁO: Không sử dụng view_context. Nó sẽ khởi tạo một thể hiện chế độ xem mới cho mỗi cuộc gọi ...
fny

7
ActionController::Base.helpers.helper_functiondường như không hoạt động. Tôi nhận được NoMethodError - undefined method spell_date_and_time' for #<ActionView::Base:0x007fede56102d0>:khi cố gắng gọi ActionController::Base.helpers.spell_date_and_time()trong một phương thức điều khiển. gọi view_context.spell_date_and_time()không hoạt động tuy nhiên.
Cá trê

37
rails 5: chỉ cần sử dụng helpers.helper_functiontrong bộ điều khiển của bạn ( github.com/rails/rails/pull/24866 )
Markus

80

Trong Rails 5 sử dụng helpers.helper_functionbộ điều khiển của bạn.

Thí dụ:

def update
  # ...
  redirect_to root_url, notice: "Updated #{helpers.pluralize(count, 'record')}"
end

Nguồn: Từ một bình luận của @Markus về một câu trả lời khác. Tôi cảm thấy câu trả lời của anh ấy xứng đáng với câu trả lời của riêng mình vì đó là giải pháp sạch nhất và dễ dàng hơn.

Tham khảo: https://github.com/rails/rails/pull/24866


6
Cảm thấy một chút kỳ lạ rằng trong bảng điều khiển bạn gọi là helpersố ít và trong bộ điều khiển, nó là số nhiều.
Người lạ

10

Vấn đề của tôi được giải quyết với Tùy chọn 1. Có lẽ cách đơn giản nhất là đưa mô-đun trợ giúp vào bộ điều khiển của bạn:

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

1
Chỉ có nhược điểm là nó thêm các hành động của bộ điều khiển với tên của các hàm trợ giúp. Nhưng tbh, tôi cũng làm vậy :)
Felix

9

Nói chung, nếu trình trợ giúp được sử dụng trong (chỉ) bộ điều khiển, tôi thích khai báo nó như là một phương thức thể hiện của class ApplicationController.


5
Như một phương pháp được bảo vệ
Benjamin Crouzier

3

Trong Rails 5+, bạn chỉ cần sử dụng hàm như được minh họa bên dưới với ví dụ đơn giản:

module ApplicationHelper
  # format datetime in the format #2018-12-01 12:12 PM
  def datetime_format(datetime = nil)
    if datetime
      datetime.strftime('%Y-%m-%d %H:%M %p')
    else
      'NA'
    end
  end
end

class ExamplesController < ApplicationController
  def index
    current_datetime = helpers.datetime_format DateTime.now
    raise current_datetime.inspect
  end
end

ĐẦU RA

"2018-12-10 01:01 AM"

0
class MyController < ApplicationController
    # include your helper
    include MyHelper
    # or Rails helper
    include ActionView::Helpers::NumberHelper

    def my_action
      price = number_to_currency(10000)
    end
end

Trong Rails 5+ chỉ cần sử dụng trợ giúp ( helpers.number_to_currency (10000) )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.