按钮调用控制器方法,显示结果

时间:2014-05-29 13:55:19

标签: ruby-on-rails button methods controller nested-resources

我有资源

User #from devise
Stream
Subscription

在我的routes.rb文件中,我将订阅作为用户的嵌套资源。

resources :users do
  resources :subscriptions
end

在Stream#show视图中,我有一个按钮,可以将@ stream.title保存到@ subscription.title。

<%= button_to "Subscribe", subscriptions_path(@subscription), :class => "button", :method => :post , :remote=>true %>

在我的订阅控制器

def create
@stream = Stream.friendly.find(params[:stream_id])
@subscription = current_user.subscriptions.create(subscription_params)
@subscription.title = @stream.title
@subscription.save
respond_to do |format|
  if @subscription.save
    format.html { redirect_to @subscription, notice: 'Subscription was successfully created.' }
    format.json { render :show, status: :created, location: @subscription }
  else
    format.html { render :new }
    format.json { render json: @subscription.errors, status: :unprocessable_entity }
  end
end
  end

耙路

 POST   /users/:user_id/subscriptions(.:format)          subscriptions#create

在我的Stream #index视图中,我想显示@ subscription.title的

  <tbody>
<% for subscription in @subscriptions %>
  <tr>
    <td><%= subscription.title %></td>
  </tr>
<% end %>

在我的Streams Controller中

def index
@streams = Stream.search(params)
@subscriptions = current_user.subscriptions.build(subscription_params)

end

我已为每个订阅添加了一个参考索引

class AddIndexes < ActiveRecord::Migration
  def change
    add_reference :subscriptions, :user, index: true
  end
end

我在Streams#show,undefined method'aleverptions_path'中收到NoMethodError。 StreamsController中的NameError #index,未定义的局部变量或方法'subscription_params'

2 个答案:

答案 0 :(得分:0)

  1. 您获得了未定义的方法subscriptions_path,因为rails会将您的format.html { redirect_to @subscription, notice: 'Subscription was successfully created.' }错误翻译。将您的@subscription更改为正确的帮助path电话。如果您不确定应在此处提供什么,则可能需要在shell中运行rake routes > routes.txt并在那里找到您的subscriptions路由定义,并使用_path

    < / LI>
  2. 您获得未定义的方法subscription_params,因为很可能您没有在任何地方定义subscription_params。您最希望访问订阅参数,例如params[:subscription]。至于访问params哈希时的正确密钥,这一切都取决于您在视图中构建表单的方式。

答案 1 :(得分:0)

<%= button_to "Subscribe", subscriptions_path(@subscription), :class => "button", :method => :post , :remote=>true %>

上面的资源不存在,您只在用户内部定义了嵌套资源订阅。

所以你应该使用嵌套资源 user_subscriptions_path 代替这样的东西。

<%= button_to "Subscribe", user_subscriptions_path(@subscription), :class => "button", :method => :post , :remote=>true %>