将变量从一个动作传递到另一个动作

时间:2013-06-02 15:15:20

标签: ruby-on-rails ruby-on-rails-3.1

我的控制器中有一个show动作:

  # GET /posts/1
  # GET /postings/1.json
  def show
    @post = Post.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @posts }
    end
  end

我在同一个控制器中也有另一个动作

  def dosomething
      @currentpost = ??
  end

如何在dosomething动作中获得对当前显示的帖子的引用?

2 个答案:

答案 0 :(得分:8)

你说dosomething是一个动作。这意味着,它是在单独的HTTP请求中调用的。

有几种方法可以在请求之间共享数据:

  • 在会话中存储
  • 如果dosomething是表单
  • 的操作,则将其存储在表单的隐藏字段中 如果dosomething 调用link_to,则
  • 将其转发为参数
  • 如果dosomethingpost的操作,并且所有这些操作都在PostsController中,那么您有了执行此操作的路线:
在您的节目视图中

使用

<%= link_to 'do something', dosomething_post_path(@post) %>

并在你的行动中

def dosomething
  @currentpost = Post.find(params[:id])
  ....
end

在您的routes.rb中需要类似

的内容
resources :posts do
  member do
    get 'dosomething'
  end
end

或表格:
在你看来:

<%= form_for @message, :url => {:action => "dosomething"}, :method => "post" do |f| %>
   <%= hidden_field_tag :post_id, @post.id %>
...

在您的控制器中:

def dosomething
  @currentpost = Post.find(params[:post_id])
  ....
end

答案 1 :(得分:0)

您必须先将所需的变量从controller传递到view。这意味着从show操作开始,您必须将变量传递给它view。从那个view开始,您必须使用此变量点击或调用dosomthing操作。

您可以通过 ajax 请求或通过dosomthing提交表单来点击/调用此view操作。