从erb rails调用方法

时间:2015-03-13 16:30:16

标签: ruby-on-rails ruby

我在tencet contoller中有erb文件

<td><%= link_to "OK", post_path(post.id), method: :suit %></td> 

和Post的控制器

helper_method  :suit

def suit
 @post.suit = true

end

路线

resources :posts

我收到此错误“没有路线匹配[POST]”/ posts / 77“”

我该如何解决?

如何通过论证?

<%= link_to "OK", suit_post_path(post), method: :put %>

我想要传递对象帖子并进入控制器

def suit

  @post = params[:post]

  @post.suit = true

  if @post.save
    redirect_to tencet_show_path
  end

end

3 个答案:

答案 0 :(得分:2)

假设你正在更新post.suit ......

您必须在config / routes.rb中定义套装路线:

resources :posts do
  put :suit, on: :member
end

另外,你不能有这样的方法:适合。它必须是其中一种方法,如post,put,get等......

所以,在你的.erb中,你会得到:

<td><%= link_to "OK", suit_post_path(post.id), method: :put %></td>

在控制器中:

def suit
  @post.suit = true

  if @post.save
    redirect_to your_desired_path
  else
    render :previous_controller_action
  end
end

答案 1 :(得分:0)

所以有几件事。首先,定义一条新路线:

resources :posts do
  post :suit, on: :member
end

你的suit方法已经到位(但是我不知道它应该做什么 - 从我希望它会引发异常的代码)。请注意,这不是helper_method。

然后更新你的链接:

<td><%= link_to "OK", suit_post_path(post), method: :post %></td> 

我希望您在当前阶段会收到TemplateMissing异常。如果您只想更新帖子,请将suit操作更改为:

def suit
  @post.update_attributes(suit: true)
  redirect :back
end

如果你仍然得到一些其他例外,你不知道该怎么做,你可能需要阅读一些Rails书籍 - 它不是一个你可以通过阅读现有代码轻松学习的框架。

答案 2 :(得分:0)

在这种情况下的方法不是指控制器方法而是HTTP方法。这也是炸毁你的路线的原因。

创建自定义操作

def toggle_suit
  @post.suit = true
  render :show
end

并更新您的路线

routes :posts do
  post '/suits' => 'posts#toggle_suits', as: :toggle_suit
end

最后更新你的erb

<%= link_to '...', toggle_suit_url(post: post), method: :post %>

这里带走的是method: :suit没有按照你的想法去做。它会导致链接创建一个不可见的表单,其中链接是提交按钮,允许它发布到您的应用程序。