When you do this, localization kicks in and renames one of the `x` to avoid conflict:

![enter image description here][1]

This is in general beneficial, and designed to prevent trouble.  In some situations, however, you don't want this localization-through-renaming to happen.  In that case you can use `Replace` instead of `With` to replace `y` by `x`.  

I like to keep using the syntax of `With` though, so in these situations I tend to use the `withRules` function defined in the middle of [this answer](http://mathematica.stackexchange.com/a/993/12).

![enter image description here][2]

The caveat with `withRules` is precisely that it does not truly localize, so you need to be very careful when using it.

----

**Update:**

Version 10-specific template based solution:

    template = (draw[x_] := Cylinder[{{#y, 0, 0}, {#y + 1, 0, 1}}, 0.1]) &
    
    template[<| "y" :> x |>]
    
    ?draw

>     draw[x_]:=Cylinder[{{x,0,0},{x+1,0,1}},0.1]





  [1]: https://i.sstatic.net/UKXWE.png
  [2]: https://i.sstatic.net/pHAfe.png