Rails中的自定义方法重定向

时间:2010-08-25 16:58:00

标签: ruby-on-rails

我在我的模型中创建了一个自定义方法,它按名称查找记录:

def find_city
  Place.find_by_name(city_name)
end

我可以使用place_path(@place.find_city)在我的视图中调用此方法,当存在具有适当名称的位置时,该方法很有用。我希望能够做的是写一个重定向,当地方不存在时,我不确定逻辑应该去哪里。基本上,我想写一些类似的东西:

respond_to do |format|
  if @place.find_city.blank?
    format.html { redirect_to :action => "new" }
  else
    format.html { render :action => "show" }
  end
end

...但我仍然希望控制器以通常的方式回复place_path(@place)。任何帮助将不胜感激!

编辑:抱歉混淆,应该进一步解释我的例子。我有一个Place模型,它同时具有'city_name'和'name'作为属性。我在上面详述的find_city自定义方法会找到其名称与另一个地方的city_name匹配的地方,例如。

Place.name = "foo"  
Place.city_name = "baz"

因此,Place.find_city会将记录显示在Place.name = "baz"。干杯!

2 个答案:

答案 0 :(得分:0)

做这样的事情

将您的模型保持为

class City < ActiveRecord::Base

  named_scope :by_name, lambda {|city|{:conditions => "name=#{city}"}}

end
控制器中的

class CitiesController < ApplicationController


  def index

    @city = City.by_name(<city name>)

    if @city.nil?

      <redirect to one place>

    else

      <redirect to another place>

    end

  end

end

并在您的视图中访问@city参数。

**通常我们不应直接从视图访问模型。要么我们应该通过控制器或助手

来做到这一点

希望这有帮助

欢呼声

sameera

答案 1 :(得分:0)

我决定为这个问题创建一个帮助方法 - 我上面描述的可能看起来有点像非正统的方法,但我只需要find_city方法为每个地方创建一个链接栏所以我认为我不需要创建一个单独的城市模型,或者定义一个正式的自我指涉关系。为了防止任何人发现这个有用,我创建了一个links_bar帮助器:

module PlacesHelper

  def links_bar(place)
    if place.city_name.blank?
       render "no_city_links"
    elsif place.find_city.nil?
      render "nil_find_city_links"
    else
      render "complete_links"
    end
  end

end

每个部分都具有所需的行为,具体取决于find_city方法是否返回记录。