Rails通过URL传递参数

时间:2012-08-07 19:04:29

标签: ruby-on-rails

我正在尝试在我的rails应用中实现搜索。我有一个User模型,其中每个用户都有idfacebook_id

如何通过facebook_id实现搜索?我打算打电话给这样的话:localhost:3000/users.json?facebook_id=123456

谢谢!

修改:我尝试了条件索引,但收到错误“我们很抱歉,但出了点问题。”

这是我的代码:

  def index
    if params[:facebook_id]
      respond_with User.find(params:facebook_id)
    elsif params[:twitter_id]
      respond_with User.find(params:twitter_id)
    else
      respond_with User.all
    end
  end

Rails日志:

2012-08-07T19:43:11+00:00 app[web.1]: Started GET "/users.json?facebook_id=1" for 173.247.200.7 at 2012-08-07 19:43:11 +0000
2012-08-07T19:43:11+00:00 app[web.1]: Processing by UsersController#index as JSON
2012-08-07T19:43:11+00:00 app[web.1]:   Parameters: {"facebook_id"=>"1"}
2012-08-07T19:43:11+00:00 app[web.1]: Completed 500 Internal Server Error in 2ms
2012-08-07T19:43:11+00:00 app[web.1]: 
2012-08-07T19:43:11+00:00 app[web.1]: NameError (undefined local variable or method `facebook_id' for #<UsersController:0x000000044b6e38>):
2012-08-07T19:43:11+00:00 app[web.1]:   app/controllers/users_controller.rb:4:in `index'

Edit2 :将参数从params:facebook_id更改为params[:facebook_id]后,我收到了另一个错误。这是我的rails日志的副本。

2012-08-07T19:53:45+00:00 app[web.1]: Started GET "/users.json?facebook_id=1000" for 173.247.200.7 at 2012-08-07 19:53:45 +0000
2012-08-07T19:53:45+00:00 app[web.1]: Processing by UsersController#index as JSON
2012-08-07T19:53:45+00:00 app[web.1]:   Parameters: {"facebook_id"=>"1000"}
2012-08-07T19:53:45+00:00 app[web.1]: Completed 500 Internal Server Error in 2ms
2012-08-07T19:53:45+00:00 app[web.1]: 
2012-08-07T19:53:45+00:00 app[web.1]: ActiveRecord::RecordNotFound (Couldn't find User with id=1000):
2012-08-07T19:53:45+00:00 app[web.1]:   app/controllers/users_controller.rb:4:in `index'

3 个答案:

答案 0 :(得分:6)

您正在错误地访问params哈希(您正在执行params:facebook_id并且它应该是params[:facebook_id])。试试这个:

def index
    if params[:facebook_id]
      respond_with User.find(params[:facebook_id])
    elsif params[:twitter_id]
      respond_with User.find(params[:twitter_id])
    else
      respond_with User.all
    end
  end

第二个错误(第二次编辑)是因为您尝试获取不存在的用户(id = 1000)。发生这种情况是因为您正在通过其主键(id)查找用户。来自guides

  

Model.find(primary_key)将引发一个ActiveRecord :: RecordNotFound   如果没有找到匹配的记录,则出现异常。

如果您想通过脸谱ID 获取,您应该可以这样做:

User.find_by_facebook_id(params[:facebook_id])

这种查找器被称为Dynamic Finders,基本上可以让你做类似的事情:

Model.find_by_field

其中field是表格中与您的模型相关的任何字段或属性。

答案 1 :(得分:1)

你的方法很好。您可以按照建议添加查询参数,并在控制器中添加逻辑,如果存在facebook_id,将搜索用户。 :facebook_id将在您的控制器操作中与URL匹配。在您的情况下,可能是User#index操作。

答案 2 :(得分:0)

您可以在视图中添加搜索表单:

<%= form_tag user_path, :method => 'post' do %>
  <%= text_field_tag :search, params[:search] %>
  <%= submit_tag "Search", :name => nil %>
<% end %>

控制器中的以下内容:

def index
  @users = User.search(params[:search])
end

然后在模型中:

def self.search(search)
  if search
    find(:all, :conditions => ['facebook_id LIKE ?', "%#{search}%"])
  else
  find(:all)
  end
end