Rails通过before_action设置本地,而不使用实例变量

时间:2015-07-15 22:05:50

标签: ruby-on-rails ruby ruby-on-rails-4

我对ruby&铁路和尝试的东西 - 我不确定它是否真的可能(甚至是有用的):

我想在before_action中设置变量,但我不希望它们是实例变量,但后来通过render locals: {}在视图中呈现。

控制器

before_action :set_image_and_location, only: [:new, :my_method]

def new
  render locals: { image: image, location: location }
end

def my_method
  # do other stuff
  render locals: { image: image, location: location }
end

private

def set_image_and_location
  image = Image.find_or_initialize_by(params[:id])
  location = Location.find(image.location_id)
end

那么如何从" set_image_and_location"中获取它们?不使用实例变量的方法?或者这是不可能的,或者总的来说是个坏主意?

2 个答案:

答案 0 :(得分:0)

有一个宝石,我认为它可能适合您的用例 - decent_exposure。

expose(:image) do
  Image.find_or_initialize_by(params[:id])
end
expose(:location) do
  Location.find(image.location_id)
end

https://github.com/hashrocket/decent_exposure

答案 1 :(得分:0)

我已经配置了通过使用自定义函数(例如locals)和实例变量before_action作为临时变量通过render_with_locals钩子预置@_locals的功能储存空间:

before_action :set_common_locals

def new
  render_with_locals
end

def my_method
  render_with_locals
end

# You can replace any parameter or add some new parameters
def my_other_method
  render_with_locals locals: { image: image2, other_option: other_option }
end

private

def render_with_locals(*args)
  options = args.extract_options!
  locals = options[:locals] || {}
  options[:locals] = @_locals.merge(locals)
  render(*args, options)
end

def set_common_locals
  @_locals ||= {
    image: image,
    location: location,
  }
end