Rails 4 before_action, truyền tham số cho phương thức được gọi


84

Tôi có mã sau:

class SupportsController < ApplicationController
  before_action :set_support, only: [:show, :edit, :update, :destroy]
  ....

Có thể truyền một chuỗi vào phương thức set_supportđược áp dụng cho cả 4 phương thức xem không? Có thể truyền một chuỗi khác cho phương thức set_supportcho mỗi phương thức trong khung nhìn không?

Câu trả lời:


161
before_action only: [:show, :edit, :update, :destroy] do
  set_support("value")
end

6
Kết hợp @tihom và phản ứng này, bạn có thể nhận được một cái gì đó như thế này before_action only: [:show, :edit, :update, :destroy] do |c| c.set_support(params[:action) end
germs12

Tôi đề xuất một chuỗi như: before_action {| action | action.update_user_balance (10000)}, trong đó update_user_balance là một phương thức mô hình lấy params: def update_user_balance (arg) ... end
mmike 15/09/2016

1
Điều này hoạt động tốt với các phương pháp dài hơn, nếu không, tôi sẽ sử dụng câu trả lời do Kyle Decot gửi bên dưới.
jkwok

52

Bạn có thể sử dụng lambda:

class SupportsController < ApplicationController
  before_action -> { set_support("value") }, 
    only: [:show, :edit, :update, :destroy]
  ...

10

Một câu trả lời ngắn gọn và một lớp lót (mà cá nhân tôi thích gọi lại ) là:

before_action except:[:index, :show] { method :param1, :param2 }

Một vi dụ khac:

after_filter only:[:destroy, :kerplode] { method2_namey_name(p1, p2) }

5

Bạn có thể chuyển một lambda cho before_actionvà truyền params[:action]cho set_supportphương thức như sau:

class SupportsController < ApplicationController
  before_action only: [:show, :edit, :update, :destroy] {|c| c.set_support params[:action]}
  ....

Sau đó, param được gửi là một trong những chuỗi: 'show', 'edit', 'update'hoặc 'destroy'.


2
Tôi đã cố gắng làm cho cú pháp này hoạt động, nhưng không thể. Cú pháp mà Kyle sử dụng phù hợp với tôi.
J3RN

cú pháp này không hoạt động
Prime

0

Bộ điều khiển Hỗ trợ

class SupportsController < ApplicationController    
  before_action only: [:show, :edit, :update, :destroy] { |ctrl|
    ctrl.set_support("the_value")
  }
...

ApplicationController

class ApplicationController < ActionController
  def set_support (value = "")
    p value
  end
...
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.