What's the right way to define an anchor tag in rails?

前端 未结 3 582
广开言路
广开言路 2020-12-14 10:18

It\'s obvious from the documentation (and google) how to generate a link with a segment e.g. podcast/5#comments. You just pass a value for :anchor

相关标签:
3条回答
  • 2020-12-14 10:28

    If you want to go through rails, I suggest content_tag (docs).

    Example:

    content_tag(:a, 'Comments', :name => 'comments')
    
    0 讨论(0)
  • 2020-12-14 10:46

    You are getting confused by Ruby's syntactic sugar (which Rails uses profusely). Let me explain this briefly before answering your question.

    When a ruby function takes a single parameter that is a hash:

    def foo(options)
      #options is a hash with parameters inside
    end
    

    You can 'forget' to put the parenthesis/brackets, and call it like this:

    foo :param => value, :param2 => value
    

    Ruby will fill out the blanks and understand that what you are trying to accomplish is this:

    foo({:param => value, :param2 => value})
    

    Now, to your question: link_to takes two optional hashes - one is called options and the other html_options. You can imagine it defined like this (this is an approximation, it is much more complex)

    def link_to(name, options, html_options)
    ...
    end
    

    Now, if you invoke it this way:

    link_to 'Comments', :name => 'Comments'
    

    Ruby will get a little confused. It will try to "fill out the blanks" for you, but incorrectly:

    link_to('Comments', {:name => 'Comments'}, {}) # incorrect
    

    It will think that name => 'Comments' part belongs to options, not to html_options!

    You have to help ruby by filling up the blanks yourself. Put all the parenthesis in place and it will behave as expected:

    link_to('Comments', {}, {:name => 'Comments'}) # correct
    

    You can actually remove the last set of brackets if you want:

    link_to("Comments", {}, :name => "comments") # also correct
    

    In order to use html_options, you must leave the first set of brackets, though. For example, you will need to do this for a link with confirmation message and name:

    link_to("Comments", {:confirm => 'Sure?'}, :name => "comments")
    

    Other rails helpers have a similar construction (i.e. form_for, collection_select) so you should learn this technique. In doubt, just add all the parenthesis.

    0 讨论(0)
  • 2020-12-14 10:46
    <%= link_to('new button', action: 'login' , class: "text-center") %>
    

    created an anchor tag for login.html i.g

    <a href="login.html" class = "text-center"> new button </a>
    

    and for

    <a href="admin/login.html" class = "text-center"> new button </a>
    

    use

    <%= link_to('new button', controller: 'admin',
        action: 'login' , class: "text-center") %>
    
    0 讨论(0)
提交回复
热议问题