1

在我的 Rails 应用程序中,我有两个控制器,即坐标控制器和推文控制器。我面临的问题是我有一些定义及其两个控制器都将使用的参数。也就是说,坐标控制器返回的值将被推文控制器使用。有没有办法解决这个问题?

我的坐标控制器代码

class CoordinatesController<ApplicationController

  def paramas(b)

    @b = params[:show]
    return @b

  end
  def coor(latitude,longitude)
    @latitude=0
    @longitude=0
  end

  def search
  @a=Coordinates.where(city: params[:show]).take
    if(params[:show]== a.city) then 
      @latitude= a.latitude
      @longitude=a.longitude
    end
    if(@latitude=0 && @longitude=0) then
    return  @sql="Select * from tweets where tweet_text LIKE '%search%' AND user_loc LIKE 'a.paramas' order by id desc"
    else if (@latitude!=0 && @longitude!=0) 
           @min_lat = @latitude - 1.0
           @max_lat = @latitude + 1.0
           @min_lng = @longitude - 1.0
           @max_lng = @longitude + 1.0
        return   @sql = "Select * from tweets where tweet_text LIKE '%search%' AND ( ((longitude BETWEEN min_lng and max_lng) AND (latitude BETWEEN min_lat and max_lat)) OR (user_loc LIKE 'a.paramas') ) order by id desc"
         else
        return   @sql="Select * from  tweets where tweet_text LIKE  '%search%'"
         end    

    end
  end     



#  a= CoordinatesController.new

结束我的 tweets_controller.rb

class TweetsController<ApplicationController
require 'coordinates_controller.rb'
#require 'models/coordinates.rb'

  def index
#include 'coordinates_controller.rb'
    a= CoordinatesController.new
    @sql=a.search
    @tweets=Tweets.paginate_by_sql(sql, :@page, :per_page => @per_page ).all
  end
end

我知道这段代码是一团糟。我不知道如何使用辅助方法和模块。谁能告诉我如何排序,以便我可以在多个控制器中使用某些方法,以便我可以使用返回的值?

我在 Rails 指南和教程中进行了搜索。我还看到了其他教程,但找不到解决方案。任何人都请帮我解决这个问题。提前致谢。

4

3 回答 3

2

使用辅助方法

将搜索方法放在您的 application.helper 或任何其他帮助程序中(假设您有 SearchHelper

然后在你的控制器中添加

include : SearchHelper
于 2013-07-18T07:28:42.090 回答
1

@shiva 说的是正确的,这似乎是模型而不是控制器的工作。如果您仍然想使用控制器,您可以创建一个父控制器

class SearchController < ApplicationController
  def search
  ...
  end
end

class CoordinatesController < SearchController
  def index
     ...
     @var.search 
  end 
end

class TweetsController < SearchController
  def index
    @var.search
  end
end

编辑

坐标模型

class Coordinate < ActiveRecord::Base #Or Service/Module, whatever makes more sense
  def search_coordinates_query
    # ... do your query creation here
    # ... wherever you used @a = ...
    # change it to latitude / longitude instead because you are already in an initialized object
  end
end

推文控制器

class TweetsController < ApplicationController
  def index
    city_coordinate = Coordinate.where(:city => params[:show]).first
    @tweets = Tweet.paginate_by_sql(city_coordinate.search_coordinates_query, @page, :pre_page => @per_page).all
  end
end

祝你好运。

于 2013-07-18T07:15:36.170 回答
0

在模型中定义搜索方法并从任何带参数的控制器调用它

您可以使用

def self.method_name

要创建静态方法(即),您可以调用该方法而不创建它的新实例。

于 2013-07-18T07:12:35.030 回答