Rails, How to render a view/partial in a model

前端 未结 10 1757
不思量自难忘°
不思量自难忘° 2020-12-22 18:55

In my model I have:

after_create :push_create

I push_create I need to render a view. I\'m trying to do that like so:

  def         


        
相关标签:
10条回答
  • 2020-12-22 19:27

    I have created a gist for this.
    I needed something similar, where the models don't necessarily (or in my case, ever) get updated via a controller, so the logic can't sit there.

    Created a server-push based controller:
    https://gist.github.com/4707055

    0 讨论(0)
  • 2020-12-22 19:33

    Rails 5 way

    In Rails 5 rendering outside a controller became pretty straightforward due to implemented render controller class method:

    # render template
    ApplicationController.render 'templates/name'
    # render action
    FooController.render :index
    # render file
    ApplicationController.render file: 'path'
    # render inline
    ApplicationController.render inline: 'erb content'
    

    When calling render outside of a controller, one can assign instance variables via assigns option and use any other options available from within a controller:

    ApplicationController.render(
      assigns: { article: Article.take },
      template: 'articles/show',
      layout: false
    )
    

    Request environment can be tailored either through default options

    ApplicationController.render inline: '<%= users_url %>'
    # => 'http://default_host.com/users'
    
    ApplicationController.renderer.defaults[:http_host] = 'custom_host.org'
    # => "custom_host.org"
    
    ApplicationController.render inline: '<%= users_url %>'
    # => 'http://custom_host.org/users'
    

    or explicitly by initializing a new renderer

    renderer = ApplicationController.renderer.new(
      http_host: 'custom_host.org',
      https: true
    )
    renderer.render inline: '<%= users_url %>'
    # => 'https://custom_host.org/users'
    

    Hope that helps.

    0 讨论(0)
  • 2020-12-22 19:34

    You should call all render methods from a controller. So, in this case, you can notify the controller that the object has been created and the controller can then render the view. Also, since you can render only once, I think you can wait for all your server side operations to complete before invoking the render.

    0 讨论(0)
  • 2020-12-22 19:36

    You can use ActionView directly and render partials to string without having a controller. I find that pattern useful to create models that encapsulate some javascript generation, for instance.

    html = ActionView::Base.new(Rails.configuration.paths['app/views']).render(
      partial: 'test', 
      formats: [:html],
      handlers: [:erb],
      locals: { variable: 'value' }
    )
    

    Then, just put your _test.html.erb in you view folder and try it out!

    0 讨论(0)
提交回复
热议问题