我有嵌套资源如下:
resources :categories do
resources :products
end
Run Code Online (Sandbox Code Playgroud)
根据Rails指南,
您还可以将url_for与一组对象一起使用,Rails将自动确定您想要的路径:
Run Code Online (Sandbox Code Playgroud)<%= link_to 'Ad details', url_for([@magazine, @ad]) %>在这种情况下,Rails会看到@magazine是一个杂志而@ad是一个广告,因此将使用magazine_ad_path助手.在像link_to这样的帮助器中,您可以仅指定对象来代替完整的url_for调用:
Run Code Online (Sandbox Code Playgroud)<%= link_to 'Ad details', [@magazine, @ad] %>对于其他操作,您只需要将操作名称作为数组的第一个元素插入:
Run Code Online (Sandbox Code Playgroud)<%= link_to 'Edit Ad', [:edit, @magazine, @ad] %>
就我而言,我有以下代码,它们功能齐全:
<% @products.each do |product| %>
<tr>
<td><%= product.name %></td>
<td><%= link_to 'Show', category_product_path(product, category_id: product.category_id) %></td>
<td><%= link_to 'Edit', edit_category_product_path(product, category_id: product.category_id) %></td>
<td><%= link_to 'Destroy', category_product_path(product, category_id: product.category_id), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
Run Code Online (Sandbox Code Playgroud)
显然它有点太冗长了,我想用rails …
我正在阅读 Michael Hartl 的 Rails 教程书,在强参数部分它说
恶意用户可以发送 PATCH 请求,如下所示:
补丁/users/17?admin=1
此请求将使用户 17 成为管理员,这将是一个潜在的严重安全漏洞。
然后我决定自己做一个“恶意用户”,以便更好地理解它。
因此,我将 :admin 添加到用户控制器中允许的属性列表中,并在 Linux 中使用curl 发送 PUT/PATCH 请求,并在控制台中查看 admin 属性是否确实通过发送恶意请求得到更新。
curl -X PUT http://localhost:3000/users/17?admin=1
Run Code Online (Sandbox Code Playgroud)
首先它抱怨“无法验证 CSRF 令牌的真实性”,然后我注释掉了
# protect_from_forgery with: :exception
Run Code Online (Sandbox Code Playgroud)
在应用程序控制器中,还消除了一些 before_actions 只是想让它工作,但我陷入了它抱怨的地方
ActionController::ParameterMissing (param is missing or the value is empty: user):
app/controllers/users_controller.rb:49:in `user_params'
app/controllers/users_controller.rb:37:in `update'
Run Code Online (Sandbox Code Playgroud)
然后我意识到我可能必须将用户参数作为参数哈希值的哈希值传递才能使其工作。如何在curl或Postman(chrome REST客户端)中实现此目的?
我对rails很新,还在学习它.现在我得到了这样的测试失败消息:
1) LayoutLinks should have the right links on the layout
Failure/Error: click_link("Help")
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching link "Help"
# ./spec/requests/layout_links_spec.rb:47:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
因为我在我的主页上有两个相同的"帮助"链接,但似乎测试认为这是一个模糊的匹配,我希望它以相同的方式测试它们,因为链接指向同一页面.
实际上网站上有几种解决方案,但由于我很新,所以大多数解决方案都很复杂,所以有人能给我最简单的解决方案吗?提前致谢.
更新:
在我的观点和规范中没有什么复杂的.我还在学习一切.
这是我的规格
visit root_path
expect(page).to have_title("Home")
click_link("About")
expect(page).to have_title("About")
click_link("Contact")
expect(page).to have_title("Contact")
click_link("Help")
expect(page).to have_title("Help")
Run Code Online (Sandbox Code Playgroud)
这是我的标题部分在布局中
<header>
<nav class="round">
<ul>
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Help", help_path %></li>
<li><%= link_to "Sign in", "#" %></li>
</ul>
</nav>
</header>
Run Code Online (Sandbox Code Playgroud)
这是我的页脚部分布局
<footer>
<nav class="round">
<ul>
<li><%= link_to "About", …Run Code Online (Sandbox Code Playgroud) 我想使用bootstrap的网格系统在页面上生成我的所有产品及其信息.我首先尝试连续生成三个产品,它使用以下代码:
<div class="container">
<h1 align="center">Listing products</h1>
<% @products.each do |product| %>
<% if @a%3 == 0 %>
<div class="row">
<% end %>
<div class="col-lg-4">
<%= image_tag(product.image_url, class: 'list_image', size: '260x320') %>
<%= product.title %> <br/>
<%= product.price %> <br/>
<%= link_to 'Show', product %><br/>
</div>
<% @a = @a+1 %>
<% if @a%3 == 0 %>
</div><hr/>
<% end %>
<% end %>
</div>
Run Code Online (Sandbox Code Playgroud)
(@a是我在控制器中声明的最初设置为0)
如果我想在屏幕变小时仅使用网格系统连续显示两个或更少的产品,则代码将不再起作用.
有没有更好的想法来实现这一目标?
ruby gridview ruby-on-rails twitter-bootstrap ruby-on-rails-4