【问题标题】:How to assign parameters and different controller method to button_to in Rails?如何在 Rails 中为 button_to 分配参数和不同的控制器方法?
【发布时间】:2017-09-30 15:58:20
【问题描述】:

button_to 在 Rails 中按照我想要的方式工作,我感到很惊讶。我在用户展示页面 (localhost:3000/users/1)。我想从那里create 一个可用性(availability_controller.rb)。我在可用性控制器中有一个create 方法。

这是可用性控制器:

  def create
    @availability = current_user.availability.build(available_on: Date.today, available_hour: params[:available_hour])
    if @availability.save
      flash[:notice] = "New availability added!"
      redirect_to current_user
    else
      flash[:error] = "Error adding availability"
      redirect_to current_user
    end
  end

它接受一个参数,available_hour

幸运的是,我能够使用form 方法创建一个表单来执行我需要的操作:

<form method="post" action="/availability">
  <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
  <button name="available_hour" value=0 type="submit" class="nowhere-block">Add Availability</button>
</form>

每当用户单击按钮时,我将值 0 硬编码为发送到可用性创建方法。这很好用,我可能可以继续生活。

但是,我认为上面的代码有点冗长,我想用button_to 实现同样的效果。我查看了button_to docs,但找不到我正在寻找的信息。

我尝试了&lt;%= button_to "Post Availability", @availability, { available_hour: 5 } %&gt;,但它给了我No route matches [POST] "/users/1" 错误。不知何故,它仍在访问用户路径。

我也尝试过其他组合,但均未成功:

<%= button_to "Post Availability", availability_path, {controller: "availability", available_hour: 5 } %>
<%= button_to "Post Availability", @availability, remote: true, class: "nowhere-block" %>

如何从用户显示内部访问可用性控制器的创建方法?

更新: 当前路线.rb:

  devise_for :users
  resources :users
  resources :friendships
  resources :availability
  root to: "users#index"


 availability_index GET    /availability(.:format)          availability#index
                         POST   /availability(.:format)          availability#create
        new_availability GET    /availability/new(.:format)      availability#new
       edit_availability GET    /availability/:id/edit(.:format) availability#edit
            availability GET    /availability/:id(.:format)      availability#show
                         PATCH  /availability/:id(.:format)      availability#update
                         PUT    /availability/:id(.:format)      availability#update
                         DELETE /availability/:id(.:format)      availability#destroy

【问题讨论】:

  • 您是否尝试将参数放在您想要的路径中:button_to "Post Availability", availability_path(available_hour: 5)
  • 你是在 config/route.rb 中添加资源路由吗? availability_path 是从 route.rb 文件派生的辅助方法。
  • @ScottMonceaux,我更新了我的帖子以显示路线。据我所知,我有resources :availability 包括在内。 Raphael,我在尝试时遇到了No route matches [POST] "/availability/1" 错误。
  • 你能运行 rake 路由并发布结果吗?我怀疑这与它不是复数的事实有关。对于微笑和笑容,还可以尝试将资源更改为可用资源,并让我们知道您得到了什么。
  • @ScottMonceaux 我更新了我的帖子。抱歉,我不确定第二个 - 你介意详细说明更改 resources to resources for availability 吗?

标签: ruby-on-rails


【解决方案1】:

你传递了一个错误的参数,如果你想使用@availability必须在users_controller#show中定义为@availability = Availability.new

回答

<%= button_to "Post Availability", availability_path(available_hour: 5) %>
#or
<%= button_to "Post Availability", Availability.new, params: {available_hour: 5} %>

【讨论】:

  • 感谢您的回复,@7urkm3n!我不打算首先使用 users_controller。我想在其他控制器中调用create 方法,即availability_controller。你认为这是一种不好的做法吗?
  • @Iggy 没关系,但取决于你想如何使用路由,比如仅在用户下可用,然后使其嵌套路由,而不是单独保留。我的帖子是否都应该工作,甚至将它们放在单独的控制器中。
【解决方案2】:

试试这个

&lt;%= button_to "Post Availability", availability_path(available_hour: 5) %&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多