Link_to方法保持重定向回根路径

时间:2014-11-06 04:07:33

标签: ruby-on-rails ruby redirect ruby-on-rails-4 path

为什么这个link_to方法会重定向到我的根路径?

用户控制器:

def show
  @user = User.find(params[:id])
  @user.comments.build
  @comment = Comment.new
  @user.votes.build
  @vote = Vote.new
end

def vote:
  @comment = Comment.find(params[:id])
  Vote.create!(voteable_id: params[:id], voteable_type: 'Comments')
  @user = User.find(params[:id])
  redirect_to @user
end

用户查看:

<%= link_to "vote", vote_comment_path(:id => comment.id), method: :post, :class=> "btn %>

routes.rb中:

post 'comments/:id/vote' => 'comments#vote', as: 'vote_comment'
resources :users do
  resources :comments
  resources :ratings
    resources :votes
  end

我期待点击投票重定向回用户,而是转到我的主页。

我可以在同一方法下两次使用params[:id]吗?

1 个答案:

答案 0 :(得分:1)

致电时

vote_comment_path(:id => comment.id)

它将comment.id传递给方法,该方法检索为params[:id]

如果params[:id]的值为comment.id,则:

def vote
  # ... 
  @user = User.find(params[:id])  # look up user by comment.id - BAD!
  redirect_to @user               # wrong user!
end  

您正在通过注释ID查找用户,而不是用户ID。

如果当前用户用户1 但评论为评论5 ,则您将被重定向到用户5 ,与评论相同的ID。

我猜测有一些授权检查会将您转发回root(例如,以用户1 身份登录时不允许查看用户5 )。检查日志以查看重定向发生的位置。


这可能是相关的,但正确的构建方式是这样的:

def show
  @user = User.find(params[:id])
  @comment = @user.comments.build
  @vote = @user.votes.build
end