开发者

Rails: Link to partials?

At the moment I try to do following:

I created several partials (i.e. _show_signature.html.erb) for my user. Now I want to show them on clicking a link. In my user controller, I created a new action:

  def show_signature
     @is_on_show_signature = true
  end

  def show_information
     @is_on_show_information = true
  end

on my user show.html.erb i coded this:

<% if @is_on_show_information %>
    <%= render :partial => 'show_information' %>
<% elsif @is_on_show_signature %>
    <%= render :partial => 'show_signature' %>
<% end %>

and in my "navigationbar" i wrote:

  <ul>
    <li class="profile-tab">
      <%= link_to 'Information', show_information_path %>
    </li>
    <li class="profile-tab">
      <%= link_to 'Signature', show_signature_path %>
    </li>
  </ul>

In my routes.rb I wrote:

  map.show_information '/user-information', :controller => 'user', :action =>开发者_开发问答 'show_information'
  map.show_signature '/user-signature', :controller => 'user', :action => 'show_signature'

now my problem:

clicking on my "information" link will redirect me to http://localhost:3000/user-information (cause I told him this path in routes.rb - I think) and I get an error:

uninitialized constant UserController

But that's not what I want... My user show path is something like:

http://localhost:3000/users/2-loginname

(by coding

  def to_param
     "#{id}-#{login.downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-')
  end

in my user model)

I want to link to somethink like http://localhost:3000/users/2-test/user-information. Any ideas how it will work? Any ideas why I get this error?


As far as Rails conventions go, the model itself is singular (User) but the table (users) and controller (UsersController) are both pluralized. This can cause a significant amount of confusion at first, and even after years of working with Rails I still make the mistake of trying things like 'user = Users.first' which is, of course, not valid, as often you get to thinking about table names instead of class names.

Also, for toggling the display of elements on a page, you probably want to use the link_to_remote method which uses AJAX for updates instead of a page refresh. If you're okay with a full page refresh, those actions will need to redirect_to something, such as the page referrer, or you will get a blank page or error since the page template does not exist.

Typically what you do is:

<ul>
  <li class="profile-tab">
    <%= link_to_remote 'Information', show_information_path %>
  </li>
  <li class="profile-tab">
    <%= link_to_remote 'Signature', show_signature_path %>
  </li>
</ul>

Then each action is as you have specified, however, the page template show_information.rjs would look like:

page.replace_html('extra_information', :partial => 'show_information')

Keep in mind you will need to have a placeholder to receive the partial contents, so simply wrap your optional sections in an element with a specific ID:

<div id="extra_information">
  <% if @is_on_show_information %>
    <%= render :partial => 'show_information' %>
  <% elsif @is_on_show_signature %>
    <%= render :partial => 'show_signature' %>
  <% end %>
</div>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜