开发者

clever universal form partials in rails

开发者 https://www.devze.com 2023-01-18 16:56 出处:网络
I have a widget for currencies which I use throughout my application.Ie. the user changes the currency from EUR -> USD, or about 13 other currencies.I have a few other use-cases such as dates but this

I have a widget for currencies which I use throughout my application. Ie. the user changes the currency from EUR -> USD, or about 13 other currencies. I have a few other use-cases such as dates but this one is the easiest to explain. Currency basically just updates a session variable by calling the currency controller and then uses some JS to re开发者_如何学Goload the page, but I'd like to only fetch certain elements of the page (ie that reflect the currency change and nothing else)...

$("#places_list").html("<%= escape_javascript(render :partial => 'places/list') %>");

or if another controller

$("#locations").html("<%= escape_javascript(render :partial => 'locations/places') %>");

but these elements are specific to the current controller, ie rendering a controller specific partial such as a list... (the currency math itself is in a an application helper, so no new logic is going on), and the currency controller is simple a partial loaded by different controllers. (Locations, Places, etc)

Other than making an action in every controller specific for this purpose, how can I make it behave in a way that I can render elements specific to the current controller, so I can replace them intelligently over js, instead of reloading? Ie. I can pass in to currency the current controller

<%= hidden_field_tag :info, controller.controller_name %>

I'm not sure if any of that makes sense, but I hope it does, at least in my own brain if not in anyone else's.


I have tried a little app and below would be a one solution for you,

first of all, in my case what I'm trying to do is to have an attribute called :info in each model , so that I can call it (<%= f.text_field :info %>) in my views (please note f can be any instance of a model)

for that I need to add :info attribute to each model. You have several ways of doing it

1 - create a class (which inherits from AR::Base and inherit all the other models from the given class) (but it requires some code changes)

2 - Quick and ugly way is to inject my :info attribute to AR::Base class (Which I did ;) )

create a file in config/initializers say curreny.rb and add this code

module ActiveRecord
 class Base
   attr_accessor :info
 end
end 

after that from any view which u uses AR, will have the :info attribute

Ex: users/new

New user

<% form_for(@user) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :info %><br />
    <%= f.text_field :info %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Back', users_path %>

Please note: this is not a very good solution, but I think with this you can start thinking

cheers

sameera

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号