Ruby on Rails Saturday, June 17, 2017



On Saturday, June 17, 2017 at 10:12:46 AM UTC-4, Walter Lee Davis wrote:

> On Jun 16, 2017, at 11:56 PM, fugee ohu <fuge...@gmail.com> wrote:
>
>
>
> On Thursday, June 15, 2017 at 5:03:37 PM UTC-4, Walter Lee Davis wrote:
>
> > On Jun 15, 2017, at 1:00 AM, fugee ohu <fuge...@gmail.com> wrote:
> >
> >
> >
> > On Wednesday, June 14, 2017 at 8:49:27 PM UTC-4, Walter Lee Davis wrote:
> > There's nothing dated about it. Using RJS (Remote JavaScript) rendering gives you the ability to render just the parts of the page you want to replace. With jQuery, you would still have to render the custom HTML that you want to inject into the page, but then you would use load() or replaceWith() to substitute it into the DOM. Now you have two problems.
> >
> > Walter
> >
> > > On Jun 14, 2017, at 7:54 PM, fugee ohu <fuge...@gmail.com> wrote:
> > >
> > > I wanna render to an element instead of redirecting so went back to my book Agile Web Development with Rails adding ajax it says to make my link remote: true and put a respond_to js in my controller and then use a js.erb file Is that a little dated I've been doing some jquery by including *.js files in assets/javascripts Can I render my views to the element using jquery instead of js.erb I notice rails doesn't generate any js.erb files by default Should I do as the book says or find a way to do it with jquery? thanks ia
> > >
> > > --
> > > 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/2a6923a4-e128-4b1f-be14-6eed119e66df%40googlegroups.com.
> > > For more options, visit https://groups.google.com/d/optout.
> >
> >
> > As I iterate through posts I don't know which post someone's going to comment but my js.erb file can only render to a class or id name so when i click comment forms are gonna load for all posts on the page What's the solution please?
>
> The way I usually do this is I have a partial for a list or table that renders just one of the items, which I gather up in the controller, then I use the content_tag_for() helper (removed from Rails 5, but available in a gem). So my list of items would look like this:
>
> <ul id="items">
> <%= render @items %>
> </ul>
>
> And to get that little bit to work, you just need to have a partial here: app/views/items/_item.html.erb with the following contents:
>
> <%= content_tag_for item, :li do %>
>   <h1><%= item.title %></h1>
>   <%= simple_format item.description %>
> <%- end -%>
>
> In this technique, remember that the local variable (item) inside the partial is named for whatever the partial is named. If you decide to change the name of the partial to item_listing, then inside that partial, your local variable would be item_listing. When you follow the pattern of naming it for the singular of the collection of items you want to render, and you name your collection for the plural, then you can use that lovely terse render @[name of the collection]. But the long form is actually render(partial: 'item', collection: @items), so when you decide to rename the collection or the partial, that's the long-form you need to use in order to clarify what you mean to Rails.
>
> 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/84d6c62f-aa8f-429b-b774-29ccacdd3581%40googlegroups.com.
> > For more options, visit https://groups.google.com/d/optout.
>
>
> Your example is with a js file in assets Can we do this with a js.erb in views instead? Same code? What about the file naming convention please Thanks


Actually, it occurred to me after I wrote this that you could do it without any JavaScript at all. In fact, that's what I usually tell people to do first, so I'm surprised I led with the JS example. The thing is, you build the JS version second, as a layer over the HTML version. That way you have a fallback.

In the _item.html.erb partial, you would change the template to include the link helper directly:

<%= content_tag_for item, :li do %>
  <h1><%= item.title %></h1>
  <%= simple_format item.description %>
  <%= link_to 'Comment', new_comment_path(item_id: item.id) %>
<%- end -%>

Now that link doesn't have to be "magic'd" into the page with JS at all. It is there and it works. Try it out, see how it works. Then layer JS on top of it (if you want to put the comment form into a modal dialog, for example).

Also, rather than continuing with your current project, I suggest you build a "stunt app" just to work out this linking issue. Just cd up a few levels in your drive, and `rails new stunt-app` and `rails scaffold Item name description:text` and `rails scaffold Comment item:references comment:text` That's enough to work with here, and by using scaffold, you will start with a known-working framework without any assumptions. If you're using Rails 5, don't forget to add the optional: true bit to your belongs_to declaration on Comment. Otherwise you will find that you cannot save an Item without comments.

Now to the naming conventions.

If you use the <%= render @items %> trick, then you have to have a file named views/items/_item.html.erb. Inside that partial, the local variable item will be loaded by the Rails framework if you have passed a collection named @items in your render call. All of that is the optimized "magic" way of doing this. It is a shortcut, and it can be expanded to:

<%= render partial: 'items/item', collection: @items %>

If you name the partial something other than the singular of the collection, then you have to use the long form. If your partial is in a different object's view hierarchy than the one that is rendering it, then you also need to put that part in the partial name (how I used items/item above).

So the same thing could be rendered as:

<%= render partial: 'foos/foo', collection: @items %>

and the partial would be changed to name the instance variable inside it 'foo'.

If you really get into the weeds, then you need to have an iterator in the parent page, and really spell it out for Rails:

<%- @items.each do |item| -%>
  <%= render partial: 'items/item', locals: { item: item } %>
<%- end -%>

The shortcuts are there to make your production work faster, and if you follow the conventions, then they just work in a way that may confuse you at first. I certainly was confused the first time I did this, particularly when I tried to use a non-conventional setup. It took me a long time for the penny to drop that the name of the instance variable inside the partial was NOT based on the name of the object being rendered, but rather the partial's filename.

Walter


What about the js to render the comment form into the div of the right post id? 

--
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-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/21f1179b-0caa-40f3-971c-f66d119c9e82%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment