jquery logic

28 views
Skip to first unread message

fugee ohu

unread,
Jun 15, 2017, 4:23:05 PM6/15/17
to Ruby on Rails: Talk
This is my jquery
$('.new_comment_button').after("<%= j render('form') %>");
I need 
$('.new_comment_button') to be contructed from the values of variables because i can't give every post the same id I don't think using class instead of id in my view would make a  difference How can i do this?

Walter Lee Davis

unread,
Jun 15, 2017, 5:11:29 PM6/15/17
to rubyonra...@googlegroups.com
If you are doing this in a RJS template, then you will have the instance variables available to you, whatever you set at the controller that is rendering this. Just render the form using the @comment you created in the controller.

I just posted an answer to a different question you raised, where I show you how to get the unique IDs on the DOM elements holding members of a collection. You can use that technique with RJS or with a single JS file that does not have any ERB replacement in it.

Walter
> --
> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/941f357b-b82a-4e27-82b4-1effb5303d12%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

fugee ohu

unread,
Jun 15, 2017, 6:09:24 PM6/15/17
to Ruby on Rails: Talk
You said: "Just render the form using the @comment you created in the controller. "
That's not gonna change $('.new_comment_button') in new.js.erb

fugee ohu

unread,
Jun 15, 2017, 6:12:31 PM6/15/17
to Ruby on Rails: Talk


On Thursday, June 15, 2017 at 5:11:29 PM UTC-4, Walter Lee Davis wrote:
Can I have the link And once I get the DOM id's how do i plug them into my js.erb file to change $('.new_comment_button') to let's say  $('.new_comment_button2') 

Walter Lee Davis

unread,
Jun 15, 2017, 6:33:02 PM6/15/17
to rubyonra...@googlegroups.com
There are a number of different ways to solve this problem. The way I imagine your app, you want to be able to comment on an item, but without having a bunch of forms rendered in the page (one for each item in a collection). Right so far? So the static (non-RJS) way to do this with jQuery is to use the DOM and JS to send the correctly unique variable to your comments controller to let it know which item you are commenting on.

# items_controller.rb

def index
@items = Item.all.page(params[:page])
end

# views/items/index.html.erb
<ul id="items">
<%= render @items %>
</ul>

# views/items/_item.html.erb
<%= content_tag_for item, :li do %>
<%= content_tag :hi, item.headline %>
<%= simple_format item.description %>
<%- end -%>

# assets/javascripts/item_comments.js
$(document).on('turbolinks:load', function(){
$('#items li').each(function(){
var elm = $(this);
elm.append('<a href="/comments/new?item_id=' + elm.attr('id').split('_')[1] + '">Comment</a>');
});
});

That gets you a link to a CommentsController, which in turn will need to decode the (bare) attribute item_id out of its querystring, and figure out which item you are commenting on.

The #content_tag_for method, which you no doubt read the documentation for, will always create a unique id on the content tag it creates, using the instance variable you pass to it to figure out what that should be. For my contrived example, that will be 'item_123' or 'item_456' or similar. Model name, singular, lower-case, followed by an underscore, followed by the ID of the instance.

It's trivial in JavaScript (using jQuery or not) to read that attribute, split it by the underscore character, and take the number off the end. So your JavaScript stays static, uses the DOM as a data source, and you don't have to write a different link for each of the items in your list.

Walter

> --
> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/c5c586c2-70f7-452c-86af-b2e247482464%40googlegroups.com.

fugee ohu

unread,
Jun 15, 2017, 10:45:31 PM6/15/17
to Ruby on Rails: Talk
Thanks Is this what everyone else is doing ? 

fugee ohu

unread,
Jun 15, 2017, 11:57:00 PM6/15/17
to Ruby on Rails: Talk
Not rendering the new comment links Only the posts render on the page but the divs render fine <div class="post" id="post_14"> and so on


 <% @user.posts.each do |commentable| %>
 <%= commentable.content %>
 <% unless commentable.attachment.blank? %>
  <%= image_tag(commentable.attachment, height: 250) %><br>
 <% end %>
 <%= div_for(commentable) do %> 
 <% end %> 
<% end %>

$(document).on('turbolinks:load', function(){ 
  $('#commentable').each(function(){ 
    var elm = $(this); 
    elm.append('<a href="/comments/new?commentable_id=' + elm.attr('id').split('_')[1] + '">Comment</a>'); 

Jason Fleetwood-Boldt

unread,
Jun 16, 2017, 1:05:17 PM6/16/17
to rubyonra...@googlegroups.com
Generally very large and apps built after 2013 have moved on to frameworks like Backbone, React, Ember, etc. 

For a simple or prototype app, RJS is totally appropriate. And as a beginning developer it's totally a great idea to learn how jQuery and Turbolinks works. 

On a larger app, coding like that you will wind up with "jQuery soup" which in my experience never really works out to build a maintainable codebase. 

Rails doesn't really have a robust "javascript solution" other than RJS, taking the agnostic stance that it is a back-end technology. Having said that, the latest version of Rails had a strongly-worded stake in the sand statement about Rails & the future of Javascript, in which a package manager (Yarn) was made the default. 

But even with Rails moving in that direction, it still means if you want to build a large, robust front-end app you'll probably be picking a JS framework or writing a bare-bones one yourself (or using a bare-bones one, like Backbone, which is what I prefer.)

What you are doing with RJS/UJS is the way to go for your purposes for a small app. 

-Jason




On Jun 15, 2017, at 10:45 PM, fugee ohu <fuge...@gmail.com> wrote:

Thanks Is this what everyone else is doing ? 

If you'd like to reply by encrypted email you can find my public key on jasonfleetwoodboldt.com (more about setting GPG: https://gpgtools.org

fugee ohu

unread,
Jun 16, 2017, 6:55:38 PM6/16/17
to Ruby on Rails: Talk
This is confusing In your example you're using items i'm using posts but now I'm questioning why I'm using polymorphic association commentable in the first place I forget To follow your example I have to yield to the posts/index action and view within the users page in my case localhost://page/:id it's like the users wall where the posts are shown I dunno how to do that yet but is that what I should do, then I could match the posts index to items index in your example Thanks in advance and thanks for showing me this example 
Reply all
Reply to author
Forward
0 new messages