ruby-on-rails:通过一条路线传递params&链接到

时间:2010-01-02 08:11:26

标签: ruby-on-rails testing routes

我有一个名字路线:

map.up_vote 'up_vote', :controller => 'rep', :action => 'up_vote

但是up_vote需要传入两个参数,postIDposterID而我似乎无法想象如何在局部进行,但在集成测试中我没有问题。

部分:

link_to 'Up Vote', up_vote_path, {:postID => session[:user_post_id], :postersID => session[:poster_id]} 

集成测试:

post up_vote_path,{:postID => @latest.id,:postersID => users(:bob).id} (this works ok)

1)部分内容发生了什么?

2)我可以对我的测试进行哪些更改以获取此信息?

2 个答案:

答案 0 :(得分:4)

一个问题:为什么要在链接中传递会话变量?你可以直接从会议中获取它们......

我不知道在会话中放置:user_post_id :poster_id 是否有任何特殊原因,但我建议你做两件事:

1)将您的变量传递到网址,会话可以 evil (尝试在您的浏览器上点击,刷新和转发)

2)在您的网址/控制器操作逻辑中使用资源

示例(仅在我说得对,你投票给用户的帖子时才有效):

路线:

map.resources :users do |user|
  user.resources :posts do |post|
    post.resource :vote
  end
end

所以你可以拥有这个网址:

/users/:id/posts/:post_id/vote

链接路径:

link_to "Up", user_post_vote_path(@user, @post), :method => :create

我使用@user和@post而不是整数,因为路径方法接受它们,你可以用以下代码构建一个更短的版本:

link_to "Up", [@user, @post, :vote] # or [:vote, @post, @user]

实现:

class VoteController ....
  def create
    # do your stuff here
  end
end

这样会更容易和RESTful。

Ryan Bates获得great episode资源,绝对值得一看。

答案 1 :(得分:3)

您希望在..._path

中传递参数
link_to "Up Vote", up_vote_path(:postID => session[:user_post_id], :postersID => session[:poster_id])

自您测试行为以来,集成测试的编写方式与link_to不同。

发布“to” up_vote_path,“with these” {params}

此外,由于您正在进行POST,您需要在link_to

中添加相应的:method选项