Jake
Jake

Reputation: 1380

How to compare two items within Ruby on Rails?

So I'm trying to re-create GitHub version control for let's say posts. I've found a way to re-create an original post using duplicate AND another method to create a new post based on the original. Cool.

My issue is being able to display both the original and the new on the same page.

What I've attempted thus far is to just rely on the show method with having:

def show
@post = Post.find(params[:id])
end

Then in the view have in the form a checkbox to allow a user to select multiple posts, click a submit, and a new page renders displaying both side by side. Preferably showing the differences between the two but that's a wish list as I deal with this first.

Actually could I just simply do?:

def other_show
@post = Post.where(params[:id])
end

I also added in status as a boolean to help on the view for marking the checkbox. Would I then need to put something in the other_show method about the status?

Upvotes: 0

Views: 360

Answers (2)

Peter Tretiakov
Peter Tretiakov

Reputation: 3410

To show 2 different entities on one page you need to give posts_controller both ids.

Declare your show method like this:

def show
  @original = Post.find(params[:id])
  @compared = Post.find(params[:compared_id])
end

Correct route to this method will look like this:

/posts/:id?compared_id=:another_id
# Example: /posts/1?compared_id=2

To construct such a link in your view, you need to declare link_to method like this:

<%= link_to '1 <> 2', post_path(@post, compared_id: '2') %>

If you want to have a page where user can check 2 checkboxes for certain posts, you'll need to construct such href via Javascript.

But in fact I wouldn't suggest you to modify show method for such a task. It is better to use show method only for showing one entity from database. You can create another method, e.g. compare and pass both parameters there.

def compare
  @original = Post.find(params[:original_id])
  @compared = Post.find(params[:compared_id])
end

In routes.rb

resources :posts do
  get 'compare', on: :collection
end

It will give you helper compare_posts_path, which will lead to /posts/compare and you'll need to pass original_id and compared_id to it, like this:

<%= link_to 'Compare', compare_posts_path(original_id: 'some_id', compared_id: 'some_another_id') %>

It will result to

/posts/compare?original_id=some_id&compared_id=some_another_id

Upvotes: 0

Leonel Gal&#225;n
Leonel Gal&#225;n

Reputation: 7167

If you want to "recreate" some sort of version control I suggest you use something like the audited. Instead of building your own. From your example and comments it seems you don't have a clear relation between all related (versions of) posts.

Using this gem, each change to the Post content (for example, if configured properly) would be stored as an audit.

Showing the differences is a different problem. That's usually called a diff and you can find gems that do it for you, for example: diffy

Upvotes: 1

Related Questions