使用link_to仅在单击链接时调用rails中的函数

时间:2016-02-13 03:00:46

标签: ruby-on-rails ruby ruby-on-rails-3

我对铁杆很新。我只是在单击链接时尝试调用函数check(),但每次加载视图时控制器也会调用该函数。

路线: 的routes.rb

Rails.application.routes.draw do
  get 'welcome/index'

  resources :articles

控制器: articles_controller.rb

class ArticlesController < ApplicationController
    helper_method :check
    def new
    end

    def create
        @article = Article.new(article_params)

        @article.save
        redirect_to @article
    end

    def check
        puts "check"
    end

    def show
        @article = Article.find(params[:id])
    end

    def index
        @articles = Article.all
    end

    private
        def article_params
            params.require(:article).permit(:title, :text)
        end

型号: article.rb

class Article < ActiveRecord::Base

end

查看: index.html.erb

<h1>
  <%= link_to 'Call on click', :onclick => check() %> 
</h1>

4 个答案:

答案 0 :(得分:0)

如果您想从link_to尝试

调用某个路线

link_to "Call on click", controller: "articles", action: "check"

然后只需添加路线get 'articles/check'

答案 1 :(得分:0)

在click函数中添加以下语句以防止调用控制器的操作

function click(event){
   event.preventDefault();
   your previous app logic
}

答案 2 :(得分:0)

routes.rb添加此内容:

get '/articles/check' => 'articles#check', as: :check_article

然后在你看来你应该做这样的事情:

<%= link_to "Check article", check_article_path, remote: true %>

注意remote:选项,它会告诉rails通过ajax发送请求而不是加载新页面(我假设这是预期的行为)。

现在,由于您通过ajax发送请求,Rails应该使用一些javascript响应请求。在CoffeeScript中会是这样的:

#views/articles/check.js.coffee
$ ->
  $("a[data-remote]").on "ajax:success", (e, data, status, xhr) ->
    alert "Article was checked."

答案 3 :(得分:0)

你在sever-side(Rails)&amp; client-side(JS)事件。

请考虑以下事项:

#config/routes.rb
resources :articles do
  get :check, on: :collection #-> url.com/articles/check
end

#app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
  def check
    # do something
  end
end

以上将允许您使用...

<%= link_to "Check", articles_check_path %>

每次“点击”链接时都会触发,实际上它会让您的浏览器转到您要查看的新操作/视图。

以上是服务器端功能。这是标准HTTP

您将以上内容与 javascript 混淆:

#app/assets/javascripts/application.js
var check = function() {
  // do something
}

以上是客户端,只能使用javascript中的onclick / .on("click"事件处理程序调用:

<%= link_to "Check", some_path, onclick: "return check();" %>

是客户端,仅适用于加载到DOM的元素。它通常用于为应用程序的前端提供额外的功能。