Ruby on Rails:通过路由和link_to传递参数

3

我有一个命名路由:

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

但是up_vote需要传入两个参数,postIDposterID,我似乎无法在partial中弄清楚如何实现,但在集成测试中没有问题。

Partial:

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)Partial文件中发生了什么?

2)我应该如何修改测试以捕获错误?

2个回答

4
一个问题:为什么要通过链接传递会话变量?您可以直接从会话中获取它们...
我不知道将:user_post_id:poster_id 放入会话中是否有特殊原因,但我建议您两件事:
1)在URL中传递您的变量,会话可能会有问题(尝试在浏览器上点击后退、刷新和前进按钮)
2)在您的URL /控制器操作逻辑中使用资源
例如(仅在我理解正确且您正在为用户的帖子投票时有效):
路由:
map.resources :users do |user|
  user.resources :posts do |post|
    post.resource :vote
  end
end

因此,您可以拥有此URL:

/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在资源方面有一集很棒的视频,值得一看。


3
你想将参数传递到..._path中。
link_to "Up Vote", up_vote_path(:postID => session[:user_post_id], :postersID => session[:poster_id])

集成测试的编写方式与link_to不同,因为您正在测试操作。

使用以下代码进行提交:"post" up_vote_path,"with these" {params}

还需要添加适当的:method选项到link_to,因为您正在执行POST操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接