views:

94

answers:

1

I'm very new to Rails.

Q1. What is the route between controller and view?

Let's say I have a controller called store_controller. I have no method in that controller but I have a view called "list"

then, I'm able to call localhost:3000/store/list ... Why am I able to call this without having list action in controller?

Q2. What if I add list method as below in controller? What will be the route if I call localhost:3000/store/list? the list method from controller and then, view? OR View first and list method from controller? or list method from controller will never be called?

def list
  logger.Write 'list in Controller'
end

Based on my test, list method from controller never get called. I'm not sure why. I'm following "Agile Web Development with Rails, 3rd Edition" book and I'm stuck at "Task C: Cart Creation".

Q3. How to call the method of controller from view without using helper or without having any template file for that method? Let's say I have a method called DoSomething in Controller.

def DoSomething
  logger.Write 'd'
end

Can I call this method from view as below?

<%= link_to "Do It", :action => "DoSomething" %>

Based on my test, it doesn't work.

Edit: Actually, view can call controller via Http Post. Let's say what we see on screen is called view. If you click on button, it will be http-post and will call controller. this is what i mean by calling the method of controller from view..

Q4. How to write the log in custom log file? if I use logger.Write then all log will be written into development.log. How can I have my custom log file?

Q5. Is there any way to create like a scheduler in Ruby and Rails? Should I use Ruby or Rails if I want to create something like a scheduler or back-end job? like pinging one feed every seconds and if new changes then get the data and insert them into database.

+2  A: 

This might need to be several questions :P ... but it is also a good basis for a wiki.

Q1. Rails uses convention - if you have a view called "list", rails is smart enough to treat this as if a list method existed. Of course, as there is no method you will not have any logic, but the view will still be rendered.

Q2. If you add a list method, Rails will now call this. Again, Rails is smart enough to assume that a list action maps to the list view. If you want to calla different view, you can use the controller's built-in "render" method.

Q3. In general, you should NOT call a controller method from the View. It's simply not part of the MVC model. You can pass data into a view, you can use a helper for any view-specific methods required. If you have extensive custom logic you can start pushing code into your models and even building modules and classes that live in your /lib directory.

Q4. There are a number of logging plugins and extensions. I have never used them, as I always found the default more than enough.

Q5. This is definitely a different question altogether. Suggest starting a new one, but do a search as I know this has been addressed quite extensively on SO before. There are a number of mechnanisms that work with Rails for scheduling.

Toby Hede
Thanks. Q2. Which one should call first? I mean, Controller.List then ListView? or ListView and then Controller.List? Q3. Okay. But I should be able to call Model from View, right? Let's say I'm implementing "Save"... I will need to call Model.Save() from View, right?
Michael Sync
You don't have to call the controller method ... rails handles that for you. You would call model.save from the controller. The view should only ever have logic for presentation.
Toby Hede
Sorry. I don't understand how Rails handles it for me. If we call http://localhost/store/newstock then Rails will automatically call "New Stock" view, right? But if user click on "Save" button, I will need to call either Controller.Save or Model.Save from View. Right? How will Rails automatically know that I want to call Save if I didn't mention it in View?
Michael Sync
The controller actions are *always* called before the view is processed. So for a save button, you would have a save action in your controller that handles the save, then use "render" to call the appropriate view.The convention where Rails will map an existing view to a corresponding path is not meant to be a replacement for MVC. In most cases, you set up an explicit action method in your controller.
Toby Hede
I'm not sure whether you got me or not.I can't test whether controller actions are always called before the view is processed. I added an action called aaa in controller. and a view "aaa.html".. I write the log in aaa action. if I called http://localhost:3000/store/aaa then I didn't get my log, Am I missing something?
Michael Sync
In that case there something wrong with your setup. You should post the code and the log output in a new question. Try using logger.debug to output.
Toby Hede
Okay. I will post the code in next pot. Thanks, Toby.
Michael Sync
actually, view can call controller via Http Post. Let's say what we see on screen is called view. If you click on button, it will be http-post and will call controller. this is what i mean by calling the method of controller from view..
Michael Sync