使用link_to_function从视图中调用方法

时间:2010-04-22 14:27:53

标签: ruby-on-rails ruby

我正在尝试让图像在点击时将所选指南与项目相关联。我正在使用有点行为的link_to_function但我无法获取我在link_to_function中调用的方法以重定向到另一个页面。有一个更好的方法吗?下面是我的一些代码。如有必要,我可以粘贴其他部分:

<% @guidelines.each do |guideline| %>
 <tr>
    <td align='center'><%= link_to_function image_tag("../../../images/icons/action_add.png"), add_guideline(guideline)  %></td>
          <td><%=h guideline.title %></td>

我的GuidelinesController.helper方法如下所示:

  def add_guideline(guideline)
           @project = Project.find(params[:project_id])
           @project.guidelines << guideline
           @project.save   

           redirect_to dashboard_path #doesn't work :(
    end

3 个答案:

答案 0 :(得分:1)

问题

link_to_function用于向您的链接添加Javascript。

在您的代码中,正在调用add_guideline,其结果将作为link_to_function调用的第二个参数传递。


修改

结帐如何Add more RESTful actions

您可以将其添加到config/routes.rb

# overwrite map.resources :projects
map.resources :projects, :member => {
  :add_guideline    => :get,
  :create_guideline => :post
}

这将添加以下路线

   add_guideline_project GET    /projects/:id/add_guideline(.:format)
create_guideline_project POST   /projects/:id/create_guideline(.:format)

在您的视图中,您可以使用

<%= link_to(
  image_tag("/images/icons/action_add.png"),
  add_guideline_project_path(@project)
) %>

这将链接到ProjectsController#add_guideline

在这里你可以做你一直在尝试的事情:

# app/controllers/projects_controller.rb
def add_guideline
  @project = Project.find(params[:id])

  # render app/views/projects/add_guideline.html.erb
  # create your form in this view
end

def create_guideline
  @project = Project.find(params[:project_id])
  @guideline = Guideline.find(params[:guideline_id])
  @project.guidelines << @guideline
  redirect_to dashboard_path
end

答案 1 :(得分:0)

在呈现页面之前评估帮助程序并返回结果... link_to_function在呈现页面后使用JavaScript客户端。

从您的代码中猜测,您可能应该在控制器中执行一项操作,该操作采用project_id和guideline_id为项目添加指南。然后,您的链接应该反映这一点,例如projects_add_guideline_path(项目,指南)以及新操作中帮助程序的内容。

在视图中:

link_to projects_add_guideline_path(@project, guideline)

在控制器中:

def add_guideline_to_project
  @project = Project.find(params[:project_id])
  @guideline = Guideline.find(params[:guideline_id])
  @project.guidelines << @guideline
  @project.save   
  redirect_to dashboard_path 
end

答案 2 :(得分:0)

我使用

来完成这项工作
<%= link_to(image_tag("/images/icons/action_add.png"), add_guideline_to_project_path(@project, :guideline_id => guideline.id))  %></td>
    <td><%=h guideline.title %></td>

和这个方法:

  def add_guideline_to
    @project = Project.find(params[:id])
    @guideline = Guideline.find(params[:guideline_id])
    @project.guidelines << @guideline
    @project.save

    redirect_to @project
  end

我还更新了我的路线,包括:

map.resources :projects, :member => {
  :add_guideline    => :get,
  :create_guideline => :post
}

谢谢大家!