在Rails中,如何从视图中的表单调用控制器中的特定方法?

Mat*_*t D 2 controller model ruby-on-rails view

新的铁路所以请耐心等待.我想做的是,我在屏幕上有一个消息列表.我希望将消息标记为"已关闭",这意味着它只需填写一个完整的日期.

我有一个模特:

class Message < ActiveRecord::Base
  attr_accessible :topic, :body, :completeDate, :created_at
  belongs_to :account
  belongs_to :user
  has_many :message_followups
end
Run Code Online (Sandbox Code Playgroud)

我有一个控制器:

class MessagesController < ApplicationController
def close
   @message = Message.find(params[:messageId])
   @message.completeDate = Date.today
   if @message.save
    redirect_to myHomeMessages_path, :flash => { :success => "Your message was closed." }
   else
    redirect_to myHomeMessages_path, :flash => { :error => "Error closing message." }
   end
end
end
Run Code Online (Sandbox Code Playgroud)

我有一个观点:

<%= form_for (???) do |f| %>
    Are you sure you wish to close this message?<br>
    <%= hidden_field_tag 'messageId', message.id.to_s %>
    <%= submit_tag "Close Message" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

我在找出如何获取form_for或form_tag以在消息控制器中调用特定方法'close'时遇到问题.非常感谢任何帮助,谢谢.

马特

Mau*_*res 6

一个非常重要的提示,你不应该在Ruby上使用camel case作为变量名,变量sand方法应该使用下划线作为分隔符,如果你来自Java之类的另一种语言,尽量避免使用你在那里使用的相同命名模式.ruby中的Camel case仅适用于类和模块名称.

我猜你正在使用Ruby on Rails 3,因为你没有说过你正在使用的东西.首先,你需要一个路由,它会在你的routes.rb文件中看起来像这样:

resources :messages do
    member do 
        post 'close'
    end
end
Run Code Online (Sandbox Code Playgroud)

对控制器稍有改动

def close
   @message = Message.find(params[:id]) #you don't need to use the hidden field here
   @message.completeDate = Date.today
   if @message.save
    redirect_to myHomeMessages_path, :flash => { :success => "Your message was closed." }
   else
    redirect_to myHomeMessages_path, :flash => { :error => "Error closing message." }
   end
end
Run Code Online (Sandbox Code Playgroud)

你的表单看起来像这样:

<%= form_for( @message, :url => close_message_path( @message ), :html => { :method => :post } ) do |f| %>
    Are you sure you wish to close this message?<br>
    <%= f.submit "Close Message" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

此表单将发布到"/ messages/ID_HERE/close",Rails将在您的请求中将"ID_HERE"值设置为"id"参数.

您可以在此处查看有关form_for的完整文档.